问题描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
思路步骤详解:
迭代法反转链表 ,核心就是:把每个节点的 next 指针,从指向后面,改成指向前面。
- 先看链表长啥样
1 -> 2 -> 3 -> 4 -> 5 -> null
反转后要变成:
null <- 1 <- 2 <- 3 <- 4 <- 5
2. 三个变量到底干嘛?
代码里只有 3 个指针:
ListNode prev = null; // 前一个节点(一开始是空)
ListNode curr = head; // 当前正在处理的节点
ListNode next; // 下一个节点(临时保存用)
它们的作用:
- prev:我要把当前节点指向它(反转方向)
- curr:正在反转的节点
- next:先存住下一个节点,不然一反转就找不到了
3. 循环里每一步在干嘛?(图解)
我们一步一步走:
初始状态
prev = null curr = 1 -> 2 -> 3...
第一次循环(处理节点 1)
next = curr.next先把 2 存起来,不然等下就丢了
next = 2
curr.next = prev把 1 指向 null
null <- 1 2->3...
-
prev = currprev 往前走一步,变成 1 -
curr = nextcurr 往前走一步,变成 2
现在状态:
prev = 1 curr = 2
第二次循环(处理节点 2)
next = 32.next = 1
null<-1<-2 3->4...
prev = 2curr = 3
你发现规律了吗?
每一轮循环,只做一件事: 把当前节点的箭头反转,指向前一个节点。
然后两个指针一起往后挪。
最后一步
当 curr 走到 null 时:
1<-2<-3<-4<-5 (prev在这里) curr = null
循环结束,返回 prev → 它就是新的头节点!
4. 用最通俗的话总结
你可以把链表想象成一排人:
- prev:前面的人
- curr:你自己
- next:后面的人
反转就是:
- 先记住后面的人是谁(next = curr.next)
- 你转身拉住前面的人(curr.next = prev)
- 前面的人变成你(prev = curr)
- 你变成后面的人(curr = next)
所有人都转一次身,链表就反转完了。
具体实现
java
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null; //左指针
ListNode curr = head; //当前节点(初始时是头节点)
while(curr != null){ //当前节点不为空 遍历到最后一个节点
ListNode next = curr.next; //把当前节点的右指针赋值给一个变量
curr.next = prev; //把左指针赋值给当前节点的右指针
prev = curr; //把当前节点赋值给左指针
curr = next; // 把右指针赋值给当前节点
}
return prev;
}
}