力扣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)
相关推荐
圣光SG36 分钟前
Java操作题练习(七)
java·开发语言·算法
Cx330_FCQ2 小时前
Tmux使用
服务器·git·算法
拳里剑气3 小时前
C++算法:多源BFS
c++·算法·宽度优先·多源bfs
ysa0510304 小时前
【板子】短序列dp(换成维护更小常数维度的dp)
c++·笔记·算法·板子
shwill1234 小时前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
wabs6665 小时前
关于图论【卡码网110.字符串迁移的思考】
数据结构·算法·图论
hanlin035 小时前
刷题笔记:力扣第242、349题(哈希表)
笔记·算法·leetcode
浮沉9876 小时前
二分查找算法例题(二)
算法
only-qi7 小时前
大模型Agent面试攻略:落地工程痛点、评估体系与Agentic RAG核心精讲
人工智能·算法·面试·职场和发展·langchain·rag
Gauss松鼠会9 小时前
【GaussDB】GaussDB锁阻塞源头查询
java·开发语言·前端·数据库·算法·gaussdb·经验总结