作者 TommyWu
本文 597 字,阅读预计需要 3 分钟
0 次阅读
标签
目录展开
目录

206. 反转链表 - 力扣(LeetCode)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* next = nullptr; ListNode* temp = head; while(temp!= nullptr){ next = temp -> next; temp -> next = prev; prev = temp; temp = next; } return prev; }};92. 反转链表 II - 力扣(LeetCode)
反转链表 2,只反转部分链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */class Solution {public: ListNode* reverseBetween(ListNode* head, int left, int right) { ListNode* dummy = new ListNode(0); dummy->next = head; ListNode* p0 = dummy; for(int i = 1;i < left;i++){ //i 从1开始,移动left- 1次,指向left前一个节点 p0 = p0->next; } ListNode* prev = nullptr; // 不是p0 ListNode* cur = p0 -> next; for(int i = left ;i <= right;i++){ ListNode* next = cur->next; cur -> next = prev; prev = cur; cur = next; } p0 -> next -> next = cur; p0 -> next = prev; return dummy -> next; }};### 关于哨兵节点
** 哨兵节点的作用**
**✅ (1) 确保 m-1 位置正确连接**
• 反转部分链表时,m-1 位置的节点需要正确指向反转后的 m 位置。
• 哨兵节点 dummy 让 prev 总是存在,无论 m=1 还是 m>1,都可以通过 dummy->next 访问 m-1 位置。
**✅ (2) 处理 m=1 的情况,防止 head 丢失**
• 反转部分链表时,如果 m=1,head 需要更新。
• 如果直接修改 head,可能导致 head 丢失,难以返回正确的新头。
• 使用 dummy,dummy->next 总是指向 head,即使 head 改变,我们仍然可以返回 dummy.next,保证正确性。
## 25. K 个一组翻转链表 - 力扣(LeetCode)
```cpp/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { int n = 0; ListNode* temp = head; while(temp){ n++; temp = temp -> next; } ListNode dummy(0,head); ListNode* p0 = &dummy; ListNode* prev = nullptr; ListNode* cur = head; for(;n >= k; n -= k){ for(int i = 0; i < k ;i++){ ListNode* next= cur->next; cur -> next = prev; prev = cur; cur = next; } ListNode* nxt = p0->next; p0 -> next -> next = cur; p0 -> next = prev; p0 = nxt; } return dummy.next; }};原文发布于 CSDN:Leetcode 经典链表问题之反转链表
接着阅读
相关推荐
Leetcode hot 100 个人总结(持续更新)笨人算法fresh man,如有纰漏万望您拨冗指正,不胜感激 二分查找 个人认为二分查找的难点主要分布在两点: 1. 不知道应该使用二分查找 2. 二分查找边界条件判断( & nums, int target) { auto ans = lower bound(nums.begi原创文章巧妙的滑动窗口 -- leetcode1423题干 1423. 可获得的最大点数 几张卡牌 排成一行 ,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 car原创文章动态规划分享之 —— 买卖股票的最佳时机我今天分享的是关于动态规划中最有名的一组题目——股票买卖问题。为什么选它?因为它覆盖了大部分DP的建模套路,同时题意又很好理解,非常适合入门。 DP 类型 简要说明 典型例子 1. 线性 DP 当前状态只与前一两个状态有关 斐波那契数列、爬楼梯、打家劫舍 2. 区间 DP 处理“原创文章