【Leetcode Top 100】206. 反转链表
问题背景
给你单链表的头节点 h e a d head head,请你反转链表,并返回反转后的链表。
数据约束
- 链表中节点的数目范围是 [ 0 , 5000 ] [0, 5000] [0,5000]
- − 5000 ≤ N o d e . v a l ≤ 5000 -5000 \le Node.val \le 5000 −5000≤Node.val≤5000
解题过程
背板题,直接抽成一个方法记下来。
初始化三个指针,分别指向当前待处理节点以及它的前后各一个节点,在循环中不断地去维护这三个指针信息即可。
要注意的是最后一轮中
c
u
r
cur
cur 指针会轮转指向
n
e
x
t
next
next 指针所指的下一个节点,所以返回的时候要返回保存了这一轮
c
u
r
cur
cur 所指节点的
p
r
e
pre
pre 指针所指节点。
具体实现
/**
* Definition for singly-linked list.
* public 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 Solution {
public ListNode reverseList(ListNode head) {
return reverse(head);
}
private ListNode reverse(ListNode head) {
// 初始化三个指针,分别指向头节点和它的前后节点
// 由于循环中会率先更新 next 指针,这个变量可以不初始化
ListNode pre = null, cur = head, next;
while(cur != null) {
// 反转操作
next = cur.next;
cur.next = pre;
// 轮转指针
pre = cur;
cur = next;
}
return pre; // 注意要返回 pre
}
}