使用递归的反向链表的问题

时间:2018-08-01 19:40:56

标签: javascript recursion

我正在尝试使用递归来反向链接列表。一切顺利,直到最后,我最终都坏掉了。

有人可以告诉我我在做什么错吗?

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,下一个:空}

代替反向链接列表。

我要去哪里错了?

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));