[链表] - 代码随想录 206. 反转链表
题目要求
反转一个单链表。
实现代码
java
/**
* 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) {
ListNode cur = head; // 当前遍历节点
ListNode pre = null; // 前驱节点 (反转后将成为后继)
while (cur != null) {
ListNode next = cur.next; // 暂存后继节点
cur.next = pre; // 反转指针:当前节点指向前驱
pre = cur; // 前驱节点后移
cur = next; // 当前节点后移
}
return pre; // 循环结束时,pre指向新链表的头节点
}
}
算法说明
该实现采用迭代法反转链表,核心步骤如下:
-
初始化指针:
cur指向当前待处理节点(初始为头节点head)。pre指向cur的前驱节点(初始为null,表示链表开头)。
-
遍历与反转:
- 循环遍历链表,直至
cur为null。 - 在每次循环中:
- 暂存
cur的下一个节点 (next)。 - 将
cur.next指向pre(完成当前节点的反转)。 - 将
pre移动到cur位置(更新前驱节点)。 - 将
cur移动到暂存的next位置(移动到下一个待处理节点)。
- 暂存
- 循环遍历链表,直至
-
返回结果:
- 循环结束时,
cur为null,pre指向原链表的最后一个节点,即反转后新链表的头节点,返回pre。
- 循环结束时,
关键点 :通过暂存 next 节点,确保在修改 cur.next 指向 pre 后,仍能找到链表的下一个节点继续遍历。