反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
思路分析
问题理解
链表反转是最经典的链表操作题之一。反转意味着把每个节点的 next 指针指向前一个节点。
原链表:1 -> 2 -> 3 -> 4 -> 5 -> null
反转后:null <- 1 <- 2 <- 3 <- 4 <- 5迭代法思路
核心思想:遍历链表,逐个改变节点的指向。
需要三个指针:
pre:指向当前节点的前一个节点(初始为 null)cur:指向当前正在处理的节点(初始为 head)temp:临时保存cur.next,因为改变指向后会丢失后续节点
算法流程
每一步的操作:
- 保存下一个节点:
temp = cur.next(防止断链后找不到后续节点) - 反转指针:
cur.next = pre(当前节点指向前一个节点) - 移动 pre:
pre = cur(pre 前进一步) - 移动 cur:
cur = temp(cur 前进一步)
循环直到 cur == null,此时 pre 就是新的头节点。
单步演示
初始状态:pre=null, cur=1
null 1 -> 2 -> 3
↑ ↑
pre cur
Step 1: temp=2, 1.next=null, pre=1, cur=2
null <- 1 2 -> 3
↑ ↑
pre cur
Step 2: temp=3, 2.next=1, pre=2, cur=3
null <- 1 <- 2 3
↑ ↑
pre cur
...复杂度分析
- 时间复杂度:O(n),遍历一次链表
- 空间复杂度:O(1),只用了常数个指针
代码实现
java
/**
* 题目:206. 反转链表
* 链接:<a href="https://leetcode.cn/problems/reverse-linked-list">...</a>
*/
public class P206reverseList {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}