力扣24.两两交换链表中的节点、25.K个一组反转链表

24.两两交换链表中的节点

一、迭代

思路:

与之前的类似,创建一个虚拟节点,来统一处理方式,然后就是按照一般的链表思路进行操作,重要的是自己在草稿本上画好图,分清楚什么时候两个节点之间的连接断了,先变动什么节点后变动什么节点。

代码:

python 复制代码
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return head
        if not head.next:
            return head
        
        dum = ListNode(next=head)
        pre = dum
        cur = dum.next

        while pre and cur and pre.next and cur.next:
            pre.next = cur.next
            cur.next = pre.next.next
            pre.next.next = cur
            pre = cur
            if cur:
                cur = cur.next

        return dum.next

复杂度分析:

  • 时间复杂度:O(n),其中 n 是链表的节点数量。需要对每个节点进行更新指针的操作。

  • 空间复杂度:O(1)。

二、递归

递归三部曲:

1、参数及返回值:参数已确定,返回值为交换后的链表头节点(即节点2)

2、递归终止条件:链表中没有节点,或者链表中只有一个节点,此时无法进行交换。

3、递归内操作:确定三个节点后,节点1指向由节点3返回的交换后的节点,节点2指向节点1

代码:

python 复制代码
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head
        
        node1 = head
        node2 = head.next
        node3 = node2.next

        node1.next = self.swapPairs(node3)
        node2.next = node1

        return node2

25.K个一组反转链表

思路:

我自己没写出来,大概知道是用反转列表来操作但死脑不想再动了...不太好解释,建议看了代码自行进行一个循环的模拟就能够理解链表指向是如何修改的了

参考:

https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/1992228/you-xie-cuo-liao-yi-ge-shi-pin-jiang-tou-plfs

代码:

python 复制代码
class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        # 统计节点个数
        n = 0
        cur = head
        while cur:
            n += 1
            cur = cur.next

        p0 = dum = ListNode(next=head)
        pre = None
        cur = head

        # 每 k 个一组处理
        while n >= k:
            n -= k
            for _ in range(k):
                temp = cur.next
                cur.next = pre
                pre = cur
                cur = temp

            # 只能说自行模拟一下,以[1, 2, 3, 4], k=2为例在纸上画一下,就知道是如何修改链表的指向的了
            temp = p0.next
            temp.next = cur
            p0.next = pre
            p0 = temp

        return dum.next
相关推荐
java_nnnn1 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
小羊没烦恼!1 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.1 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净2 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心2 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机
别动我齐刘海3 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
文丑颜不良啊4 小时前
LeetCode276~300题目解析
java·leetcode
荆棘鸟智能4 小时前
短历时洪水预报算法实践:水文模型与 LightGBM 残差订正融合
人工智能·算法·机器人
葫三生4 小时前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
catcatuncle4 小时前
OpenWorkBuddy 部署排错手册:从源码启动到自己搭一个给团队用,七个最容易卡住的地方
算法