文章目录
- 写在前面
- Tag
- 题目来源
- 解题思路
- 方法一:迭代
- 写在最后
写在前面
本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……
专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:
- Tag:介绍本题牵涉到的知识点、数据结构;
- 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
- 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
- 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
- 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。
Tag
【链表-反转】【迭代】
题目来源
25. K 个一组翻转链表
解题思路
方法一:迭代
思路
根据题目要求,我们需要将链表中每 k
个节点翻转。我们先统计链表中的节点数,然后每 k
个节点作为一组,在这一组中进行链表翻转,翻转后我们利用一个节点 p0
将已经翻转的节点和接下来将要翻转的节点沟通起来。
先看代码,代码参考自 灵茶山艾府的题解。
代码
class Solution {
public:ListNode *reverseKGroup(ListNode *head, int k) {int n = 0;for (ListNode *cur = head; cur; cur = cur->next)++n; // 统计节点个数ListNode *dummy = new ListNode(0, head), *p0 = dummy;ListNode *pre = nullptr, *cur = head;for (; n >= k; n -= k) {for (int i = 0; i < k; ++i) { // 翻转链表ListNode *nxt = cur->next;cur->next = pre;pre = cur;cur = nxt;}ListNode *nxt = p0->next;p0->next->next = cur;p0->next = pre;p0 = nxt;}return dummy->next;}
};
结合 示例 1 对上述代码进行图解。
在 外循环 1 中,我们根据 206. 反转链表 先将第一组的链表反转。接着更新指针 p0
指向第二组链表的头结点。
同理可以得到 外循环 2 的结果。
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n 为链表的节点个数。
空间复杂度: O ( 1 ) O(1) O(1)。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。