链表的逆转:可以有两种实现方法:一种是递归,一种是迭代
下面代码是链表节点的构造函数,然后把每一个节点通过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;
递归方法和迭代方法来反转链表。
1.递归方法:如图:
首先:麻烦各位先理解好递归,下面是我对递归的总结:
1.找出口
2.找最基本的循环单元(操作)
3.判断操作前递归还是操作后递归
如果操作当前的元素,那么就在操作后在进行递归
如果要操作当前元素的下一个元素,那么就在递归会在操作
在链表逆置里,
递归的出口是:head == null
循环单元是:上图的的下方每一个执行体
我要执行的操作是在递归之后才进行的,也就是得在我们招到最后一个循环单元之后,才会执行我们想要得操作,然后再去执行上一次递归得操作。如下图:
2.迭代方法:
迭代方法是通过两个变量(即指针)来保存当前的节点和前一个节点,然后来操作按顺序修改每一个节点next的指向。
与递归方法不同,他是从从前面开始改,而递归方法是从后面开始改。
// 递归
var reverseList = function(head) {
if(head == null) {
return;
}
if(head.next.next !== null) {
reverseList(head.next);
}
head.next.next = head;
head.next = null;
};
console.log(node1);
reverseList(node1);
console.log(node5);
// 迭代
function nzhi(head) {
var cur = head;
var pre = null;
while(cur != null) {
var next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
}
nzhi(node5);
console.log(node1);