[路飞]-[leetcode]剑指 Offer II 024. 反转链表

124 阅读1分钟

反转链表,等于:改变链表中每个节点的next值。

1.改变一个节点的next状态

要改变所有节点的next值,我们至少要能改变一个节点的next值,把一个节点的next值修改为该节点的父节点。当前节点及其父节点的值很容易拿到,拿到之后做赋值,伪代码实现:

    node.next = parent

2.对每个节点重复这个操作,使用循环或递归都可以。这里以递归为例:

function recur(node,parent){
    if(node.next) recur(node.next,node)

    node.next = parent

}

3.取出新链表

到上一步结束,链表反转已经完成了,但反转的链表没有return。这一步把反转的链表return。实现方式是,修改recur函数,在迭代处理单个节点的逻辑中,增加逐层return新链表头节点的逻辑,透传新链表的头节点:

function recur(node,parent){
    // node.next为null,说明已经迭代到原链表底部,此时的node就是新链表头节点
    const root = node.next ? recur(node.next,node) : node
    
    node.next = parent
    
    return root// 透传

}

完整代码😊(可复制至leetcode运行)

var reverseList = function(head) {
    if(!head)return head
    
    return recur(head,null)
    
};

// 每次迭代,改变当前节点的next状态,用parent
function recur(node,parent){
    const root = node.next ? recur(node.next,node) : node//有next则迭代 

    node.next = parent
    
    return root
}