方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转——浪费空间
方法2:使用3个指针遍历单链表,逐个链接点进行反转。
在调整节点q的指针时,需要知道q节点本身,还需要知道它的前一个节点p,因为需要把节点q的next指向节点p;还需要知道q的下一个节点r,以防止链表断开。因此,需要定义3个指针,分别指向当前遍历到的节点、它的前一个节点以及后一个节点。
反转后的表头节点是原始链表的尾节点。、
var Node = function (value,next) {
this.value = value;
this.next = next;
}
var NodeList = function (head) {
this.head = head;
}
//反转
function reverse(nodeList) {
var head = nodeList.head;
if(head == null || head.next == null) //判断头节点是否空|少于两个节点没必要进行反转
return head;
var p,q,r; //三个指针
p = head; //将头节点给p
q = p.next; //p的下一节点给q
head.next = null; //将反转后的链表,头节点的下一指针为空
while (q){ //q不断指向右侧的下一节点
r = q.next; //q的右侧为r——获取当前节点q的下一节点
q.next = p; //向左指,q的指针指向p——指针反转
p = q; //p右移,上一节点p指向当前节点q
q = r; //q右移,当前节点q赋值为下一节点
}
nodeList.head = p;
console.log(nodeList.head) //头节点。nodeList.head.value
console.log(nodeList); //反转后的链表
}
//测试
//var arr = [0,1,2,3,4,5];
var arr = [0];
//将整个数组转换成链表的结构
var nodeList = new NodeList(); //声明链表
nodeList.head = new Node(arr[0]); //链表中的节点,将数组的第一个元素给链表的头节点
var cur = nodeList.head; //
for (var i=1;i<arr.length;i++){
var tmp = new Node(arr[i]);
cur.next = tmp; //cur不断向后移动,指向下一节点
cur = tmp;
} ;
cur.next = null; //将最末尾的节点指针设置为null;
console.log(nodeList); //原链表
reverse(nodeList); //链表反转