[面试精选] 0206. 反转链表

1. 题目链接


206. 反转链表 - 力扣(LeetCode)


2. 题目描述


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


3. 题目示例


示例 1 :

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2 :

输入:head = [1,2]
输出:[2,1]

4. 解题思路


  1. 问题理解
    • 给定一个单链表,要求将其反转
    • 反转后原链表的头节点变为尾节点,尾节点变为头节点
    • 所有节点的next指针方向需要反转
  2. 关键思路
    • 三指针法:使用pre、cur、nxt三个指针
      • pre:记录前驱节点(已反转部分的头节点)
      • cur:当前待处理节点
      • nxt:临时保存下一个待处理节点
    • 指针操作
      1. 保存当前节点的下一个节点(nxt = cur.next)
      2. 反转当前节点的指针(cur.next = pre)
      3. 前移pre指针(pre = cur)
      4. 前移cur指针(cur = nxt)
  3. 算法流程
    • 初始化pre为null,cur为head
    • 遍历链表:
      • 每次处理一个节点,反转其指针方向
      • 更新pre和cur指针
    • 当cur为null时,pre即为新链表的头节点

5. 题解代码


class Solution {
    public ListNode reverseList(ListNode head) {
        // pre指针用于记录前驱节点,初始为null(反转后的尾节点指向null)
        ListNode pre = null;
        // cur指针用于遍历链表,初始指向头节点
        ListNode cur = head;
        
        // 遍历链表直到当前节点为null
        while (cur != null) {
            // 临时保存当前节点的下一个节点
            ListNode nxt = cur.next;
            // 反转当前节点的指针方向,指向前驱节点
            cur.next = pre;
            // pre指针前移到当前节点
            pre = cur;
            // cur指针移动到之前保存的下一个节点
            cur = nxt;
        }
        
        // 循环结束时pre指向新的头节点
        return pre;
    }
}


6. 复杂度分析


  1. 时间复杂度
    • 需要遍历整个链表一次
    • 时间复杂度为O(n),n为链表长度
  2. 空间复杂度
    • 只使用了常数个额外指针
    • 空间复杂度为O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值