【面试经典 150 | 链表】K 个一组翻转链表

发布于:2024-04-23 ⋅ 阅读:(133) ⋅ 点赞:(0)

写在前面

本专栏专注于分析与讲解【面试经典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)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。


网站公告

今日签到

点亮在社区的每一天
去签到