题目
反转一个单链表
图解
要理解单链表的反转,一定要画图!!!
初始状态:
第一步操作:让当前工作节点先保存好下一个节点,再指向前一个节点
第二步操作:更新 prev 和 curr 所代表的节点
文字解释
反转单链表包括以下几步:
- 保存当前工作节点的下一个节点到nextTemp (保存下一个)
- 将当前工作节点的指向为 prev节点(断开并指向之前一个)
- 此时节点的指向已经反转了,将工作节点和prev标志的节点后移(更新工作节点和prev节点)
即有个 curr节点,专门处理当下节点的事情
有个 prev节点,表示的是上一个工作节点。
处理过程中,两个节点不断向后移动。
代码(Java)
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
以上的代码还可以使用递归的方式实现:
class Solution {
public ListNode reverseList(ListNode head) {
// 使用递归也能实现单链表的反转
return helper(head, null);
}
public ListNode helper(ListNode curr, ListNode prev){
if (curr == null) return prev;
// 暂存下一个
ListNode next = curr.next;
// 更新指向
curr.next = prev;
// 移动 curr和 prev指向
return helper(next, curr);
}
}
链表的题目不懂就多画图
类似的题目:LeetCode 25 K 个一组翻转链表