这是我参与更文挑战的第3天,活动详情查看: 更文挑战
链表的逆置
上面是一个链表简单的图,从1依次指到5,那么它的逆置,就是让它从5依次指到1。那么我们如何来解决这个问题呢?
因为一开始1的next指向2,那么我们先让2的next指向1行不行呢?答案是不行的。
如图所示,这样子会让1指向2,2指向1,2和3之间的链接会断开,这样子肯定是不行的。
那么它的突破口在哪呢?实际上面的图还有一个隐藏的点还没有画,就是5也有一个next,不过它的next是指向空的,如下图所示
所以链表的逆置的突破点在于先找到最后一个节点,然后让最后一个节点指向倒数第二个节点。
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);
接下来我们可以看看结果
这样链表的逆置就实现了。