2017-02-01 7 views
0

У меня есть следующий узел конструктор:коммутационные узлы в двойном связанном списке вызывает бесконечной рекурсии

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

, который используется внутри моего LinkedList конструктора:

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

и я могу вставить узлы с Следующий метод:

LinkedList.prototype.insert = function(item,after){ 
    const newNode = new Node(item) 
    const curr = after ? this.find(after) : this.head 
    newNode.next = curr.next 
    newNode.previous = curr 
    curr.next = newNode 
} 

с 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 
} 

Мой вопрос теперь я пытаюсь реализовать switch функцию на LinkedList, где я могу передать в двух значениях и переключите свое местоположение в списке. Ниже то, что у меня есть, и это, кажется, работает для элементов, которые не рядом друг с другом:

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

Проблема, которую я вижу, заключается в вашей функции вставки. Если у Вас есть связанный список с двумя элементами, и вы называете вставку («Новый узел», пустой) список выглядит так:

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 

тогда вы пытаетесь достичь next поле null, что приводит к аварии.

+0

Я не понимаю, почему 'null' приведет к бесконечной рекурсии. Он должен просто выбросить ошибку. –

+0

Почему вы думаете, что это вызывает «бесконечную рекурсию»? Я не могу сказать по вашему вопросу, так как вы не указали ошибку или то, что видите на терминале. – ilke444

Смежные вопросы