1. 问题描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
2. 解题思路
定义两个指针: pre 和 curr ;pre 在前,curr 在后。
每次让 pre 的 next 指向 curr ,实现一次局部反转
局部反转完成之后,pre 和 curr 同时往前移动一个位置
循环上述过程,直至 pre 到达链表尾部
null 1 ---> 2 ---> 3 ---> 4 ---> 5
/|\ /|\
| |
curr pre
null <--- 1 2 ---> 3 ---> 4 ---> 5
/|\ /|\
| |
curr pre
null <--- 1 <--- 2 3 ---> 4 ---> 5
/|\ /|\
| |
curr pre
null <--- 1 <--- 2 <--- 3 4 ---> 5
/|\ /|\
| |
curr pre
null <--- 1 <--- 2 <--- 3 <--- 4 5
/|\ /|\
| |
curr pre
null <--- 1 <--- 2 <--- 3 <--- 4 <--- 5 null
/|\ /|\
| |
curr pre
3. 代码实现
import java.util.List;
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
class ListOperation {
public static void show(ListNode head) {
if (head == null) {
System.out.println("EMPTY LIST!");
return;
}
ListNode currNode = head;
while (currNode.next != null) {
System.out.print(currNode.val);
System.out.print("->");
currNode = currNode.next;
}
System.out.print(currNode.val);
System.out.println();
}
}
public class Solution206 {
public ListNode reverseList(ListNode head) {
ListNode curr = null;
ListNode pre = head;
while (pre != null) {
ListNode tempNode = pre.next;
pre.next = curr;
curr = pre;
pre = tempNode;
}
return curr;
}
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
Solution206 solution206 = new Solution206();
ListOperation.show(solution206.reverseList(node1));
}
}
5->4->3->2->1