链表的逆置

461 阅读1分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

链表的逆置

批注 2021-06-02 224526.png 上面是一个链表简单的图,从1依次指到5,那么它的逆置,就是让它从5依次指到1。那么我们如何来解决这个问题呢?
因为一开始1的next指向2,那么我们先让2的next指向1行不行呢?答案是不行的。

批注 2021-06-03 222918.png 如图所示,这样子会让1指向2,2指向1,2和3之间的链接会断开,这样子肯定是不行的。
那么它的突破口在哪呢?实际上面的图还有一个隐藏的点还没有画,就是5也有一个next,不过它的next是指向空的,如下图所示

批注 2021-06-03 224017.png 所以链表的逆置的突破点在于先找到最后一个节点,然后让最后一个节点指向倒数第二个节点。

function Node (value){
    this.value = value;
    this.next = null;
}
var node1 = new Node(1);
var node2 = new Node(2);
var node3 = new Node(3);
var node4 = new Node(4);
var node5 = new Node(5);

node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;

function nizhi(root){
    if(root.next.next == null) {//代表当前的节点是第二个节点
         root.next.next =root;//让最后一个节点指向自己(也就是倒数第二个节点)
         return root.next;//返回最后一个节点
    } else {
        var result = nizhi(root.next);
        root.next.next = root;//如果不是倒数第二个,让下一个节点的指向指向自己
        root.next = null;//让自己的指向指向空
        return result;
    }    
}
var newRoot = nizhi(node1);
function bianLink(root){
    if (root == null) return;
    console.log(root.value);
    bianLink(root.next);
}
bianLink(newRoot);

接下来我们可以看看结果

批注 2021-06-03 234321.png

这样链表的逆置就实现了。