力扣206.反转链表 92.反转链表II

LeetCode 206. 反转链表(简单)

题目:反转一个单链表。

示例

复制代码
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解法一:迭代(双指针)

cpp 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr) {
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};

解法二:递归

cpp 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode* newHead = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return newHead;
    }
};

LeetCode 92. 反转链表 II(中等)

题目 :反转从位置 leftright 的链表节点(索引从 1 开始)。

示例

复制代码
输入: 1->2->3->4->5->NULL, left = 2, right = 4
输出: 1->4->3->2->5->NULL

解法:一次遍历 + 局部反转

思路

  1. 找到待反转部分的前一个节点 pre 和起始节点 start
  2. 反转 [left, right] 区间内的节点,记录反转后的头尾。
  3. pre 连接到反转后的头,反转后的尾连接到后续节点。
cpp 复制代码
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        if (!head || left == right) return head;
        
        ListNode dummy(0);
        dummy.next = head;
        ListNode* pre = &dummy;
        
        // 1. 移动 pre 到 left 的前一个节点
        for (int i = 1; i < left; ++i) {
            pre = pre->next;
        }
        
        // 2. 反转 [left, right] 区间
        ListNode* curr = pre->next;
        ListNode* prev = nullptr;
        for (int i = left; i <= right; ++i) {
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        
        // 3. 连接
        pre->next->next = curr;  // 原 left 节点的 next 指向 right 后面的节点
        pre->next = prev;        // pre 指向反转后的头节点
        
        return dummy.next;
    }
};

复杂度

  • 时间:O(n)
  • 空间:O(1)
相关推荐
cheems95278 小时前
[算法手记] 贪心 爬楼梯问题
算法·贪心算法
KaMeidebaby8 小时前
卡梅德生物技术快报|酵母双杂交 cDNA 文库构建与蛋白互作筛选流程
服务器·前端·数据库·人工智能·算法
圣保罗的大教堂8 小时前
leetcode 3300. 替换为数位和以后的最小元素 简单
leetcode
sheeta19988 小时前
LeetCode 每日一题笔记 日期:2026.05.27 题目:3121. 统计特殊字母的数量 II
笔记·算法·leetcode
ST——Jess8 小时前
年度行业趋势研究报告:泛心理数字化赛道“流日推演”的算法困境与高保真交互范式重构
人工智能·算法·架构
Tisfy8 小时前
LeetCode 3300.替换为数位和以后的最小元素:一次遍历
数学·算法·leetcode·模拟
garmin Chen9 小时前
LeetcodeHot100打卡(14、合并空间,15、轮转数组,16、除了自身以外数组乘积,17.缺失的第一个整数)
java·笔记·学习·算法
elseif1239 小时前
【C++】vector 详细版
开发语言·c++·算法
变量未定义~9 小时前
既约分数、阶乘约数、逆元、最大质因子个数【算法赛】
算法