1. 使用非递归的方式来翻转链表
链表逆序的本质就是把每一个节点原本指向下一个节点的next指针倒转过来,指向它的前置节点,如果从链表的某个节点来看要把它的next指针倒转,我们最少需要同时知道三个节点,因为我们需要知道当前节点的前一个节点,后一个节点以及节点本身这样,后一个节点是因为我们在把当前节点的next指向前一个节点的之后,假如没有保存后一个节点的引用那么后一个节点就找不到了
需要经过下面的步骤:
① 让我们从链表头部开始,建立三个临时节点的引用,分别为p1,p2,p3。它们分别指向头节点、第二个节点、第三个节点,把p2节点原本指向p3的next指针倒转,指向p1
② 三个临时节点引用p1,p2,p3分别向后移动一格位置
③ 重复第 ① 步的工作,以p2节点为视角,把p2节点原本指向p3的next指针倒转,指向p1
继续像这样子迭代下去,一直到p2是空为止
④ 最后,把head节点的next指向空,成为逆序链表的尾节点。并且把p1赋值给head,让p1所在的节点成为逆序链表的头节点
2. 代码如下:
public class Main{
public static class LinkedNode{
int data;
LinkedNode next;
LinkedNode(int data){
this.data = data;
}
}
public static void main(String[] args) {
//初始化链表
head = new LinkedNode(4);
head.next = new LinkedNode(2);
LinkedNode temp = head.next;
temp.next = new LinkedNode(1);
temp = temp.next;
temp.next = new LinkedNode(3);
temp = temp.next;
temp.next = new LinkedNode(6);
//逆序输出链表
temp = head;
while(temp != null){
System.out.print(temp.data + " ");
temp = temp.next;
}
//逆序链表
reverseLinkedList();
System.out.print("\n");
temp = head;
while(temp != null){
System.out.print(temp.data + " ");
temp = temp.next;
}
}
private static LinkedNode head;
public static void reverseLinkedList(){
if(head == null || head.next == null)return;
LinkedNode p1 = head;
LinkedNode p2 = head.next;
LinkedNode p3;
while(p2 != null){
p3 = p2.next;
p2.next = p1;
p1 = p2;
p2 = p3;
}
head.next = null;
head = p1;
}
}