Skip to content

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

思路分析

问题理解

链表反转是最经典的链表操作题之一。反转意味着把每个节点的 next 指针指向前一个节点。

原链表:1 -> 2 -> 3 -> 4 -> 5 -> null
反转后:null <- 1 <- 2 <- 3 <- 4 <- 5

迭代法思路

核心思想:遍历链表,逐个改变节点的指向。

需要三个指针:

  • pre:指向当前节点的前一个节点(初始为 null)
  • cur:指向当前正在处理的节点(初始为 head)
  • temp:临时保存 cur.next,因为改变指向后会丢失后续节点

算法流程

每一步的操作:

  1. 保存下一个节点temp = cur.next(防止断链后找不到后续节点)
  2. 反转指针cur.next = pre(当前节点指向前一个节点)
  3. 移动 prepre = cur(pre 前进一步)
  4. 移动 curcur = 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;
    }
}