Skip to content

206. 反转链表

题目链接:https://leetcode.cn/problems/reverse-linked-list/

代码

ts
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function reverseList(head: ListNode | null): ListNode | null {
    let prev = null;
    let now = head;
    while(now){
        const next = now.next;
        now.next = prev;
        prev = now;
        now = next;
    }
    return prev;
};

思路

使用迭代法反转链表:

  1. 初始化三个指针:

    • prev = null:指向前一个节点
    • now = head:指向当前节点
    • next:临时保存下一个节点
  2. 遍历链表,对每个节点进行操作:

    • 保存当前节点的下一个节点:next = now.next
    • 反转当前节点的指针:now.next = prev
    • 移动 prevnow 指针:prev = now, now = next
  3. nownull 时,prev 就是新的头节点

这个算法通过改变每个节点的 next 指针方向来实现链表反转,是最经典的链表反转方法。

  • 时间复杂度 O(n),其中 n 是链表的长度
  • 空间复杂度 O(1)