我正在尝试使用递归来反向链接列表。一切顺利,直到最后,我最终都坏掉了。
有人可以告诉我我在做什么错吗?
const reverseLinkedList = (node, newChildOldParent=null ) => {
if( node.next ){
reverseLinkedList(node.next, node);
}
node.next = newChildOldParent;
return node;
}
const someList = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
console.log(reverseLinkedList( someList ))
我知道
{值:1,下一个:空}
代替反向链接列表。
我要去哪里错了?
答案 0 :(得分:4)
反转很好,但是您忘记了新头,而是返回了旧头,现在它指向null
。这是堆栈调用的示意图:
curr: 1 next: 2
curr: 2 next: 3
curr 3: next: 4
curr: 4 next: null
curr: 4 next: 3
curr: 3 next: 2
curr: 2 next: 1
curr: 1 next: null <-- uh oh
您需要跟踪新的头,即节点4。这是将最后一个节点传递回头的另一种方法:
const reverseLinkedList = (curr, prev) => {
if (curr.next) {
const newHead = reverseLinkedList(curr.next, curr);
curr.next = prev;
return newHead; // pass the new head up the list
}
curr.next = prev;
return curr; // base case; return the tail
};
const someList = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
console.log(reverseLinkedList(someList));