У меня есть следующий узел конструктор:коммутационные узлы в двойном связанном списке вызывает бесконечной рекурсии
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
метод, но я не могу для жизнь меня выясняет, что.
Где функция 'find()'? – Pointy
@Pointy отредактировал сообщение, чтобы показать метод find –
Думаю, вам нужно захватить значения '.previous.next' для обеих записей перед повторной назначением. – Pointy