2017-02-01 13 views
0

が発生します。スイッチング・ノード私は、次のノードのコンストラクタ持つ無限再帰

const Node = function(data){ 
    this.data = data 
    this.next = null 
    this.previous = null 
} 

私のLinkedListコンストラクタの内部で使用されています

const LinkedList = function(){ 
    this.head = new Node('head') 
} 

をし、私は、ノードを挿入することができます以下の方法:

findの方法は:

LinkedList.prototype.find = function(item){ 
    let currentNode = this.head 
    while(currentNode && currentNode.data !== item){ 
    currentNode = currentNode.next 
    } 
    return currentNode 
} 

そして、次のような方法で、配列などの項目を表示することができます。

LinkedList.prototype.toArray = function(){ 
    const arr = [] 
    let currItem = this.head.next 
    while(currItem){ 
    arr.push(currItem.data) 
    currItem = currItem.next 
    } 
    return arr 
} 

私の問題は、今私は、私は2つの値を渡すことができLinkedListの上switch機能を実装しようとしていますされており、リスト内でその位置を切り替えます。以下は、私が持っている、お互いに隣接していないアイテムのために働くように思われているもの:これは私のコンピュータは、私は交換時に無限再帰をヒットさせるために引き起こしている私は、私がここで間違ってやっているかと思っています

LinkedList.prototype.switch = function(a,b){ 
    const aNode = this.find(a), 
     bNode = this.find(b) 
    if(!aNode || !bNode){ 
    throw new Error('Both nodes were not inside of the list') 
    } 
    const aNext = aNode.next, 
     aPrevious = aNode.previous, 
     bNext = bNode.next, 
     bPrevious = bNode.previous 

    aNode.next = bNext 
    aNode.previous = bPrevious 
    aNode.previous.next = aNode 

    bNode.next = aNext 
    bNode.previous = aPrevious 
    bNode.previous.next = bNode 

} 

互いのすぐ隣にある要素。例えば、コードの以下の行は動作します:私は、次のコードを持っている場合

const list = new LinkedList() 
list.insert(1) 
list.insert(2,1) 
list.insert(3,2) 
list.switch(1,3) 
list.toArray() // [3,2,1] 

はしかし、それ

const list = new LinkedList() 
list.insert(1) 
list.insert(2,1) 
list.switch(1,2) 
list.toArray() // crashes terminal 

私はそれが私のswitch方法で愚かな論理エラーです知っているが、私はのためにすることはできません私の人生は何が分かりますか?

+1

「find()」関数はどこにありますか? – Pointy

+1

@Pointyは、findメソッドを表示するために投稿を編集しました –

+0

再割り当てする前に、両方のエントリに対して '.previous.next'の値を取得する必要があると思います。 – Pointy

答えて

1

私が見る問題は、あなたの挿入機能です。次の2つの項目にリンクされたリストを持っていて、挿入(「新しいノード」、NULL)を呼び出した場合は、あなたのリストは次のようになります。

enter image description here

あなたはまだこのような新しいノードへの以前のポインタを設定する必要があります:

LinkedList.prototype.insert = function(item,after){ 
    const newNode = new Node(item); 
    const curr = after ? this.find(after) : this.head; 
    newNode.next = curr.next; 
    curr.next.previous = newNode; <----- This is the extra line 
    newNode.previous = curr; 
    curr.next = newNode; 
} 
0

bNode.previousの場合はnullあり、そしてあなたは、次のよう

aNode.previous = bPrevious 
    aNode.previous.next = aNode 

を割り当てた場合、あなたはクラッシュしnullnextフィールドを、到達しようとしています。

+0

なぜ 'null'が無限再帰を引き起こすのか分かりません。それは単にエラーを投げるべきです。 –

+0

なぜそれが「無限再帰」を引き起こすと思いますか?私は、あなたがエラーを提供していないか、端末で何を見ているのか分からないので、あなたの質問からはわかりません。 – ilke444

関連する問題