LeetCode刷题记录----24.两两交换链表中的节点(medium)

2025/7/25

题目:


我的思路:

显然,这道题需要在结点之间进行两两交换,但不能直接修改结点值,只能通过调整next指针来实现。我们可以将结点两两分组进行交换操作,但需要注意:每次交换后,需要将上一组交换后的末尾结点的next指针指向当前组交换后的前驱结点的next指针。也就是说,每次交换实际上涉及三个连续的结点。因此,建议使用一个哑结点作为辅助,这样即使在链表开头进行交换,也能遵循相同的操作规则。

总之就是:

①声明哑结点作为链表的新头结点

②对结点之间两两交换,并更新两结点和前一个结点的连接关系

代码如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head

        #1.正向遍历迭代交换
        dummy = ListNode(0,head)    #自定义头结点
        last,prev,cur =dummy, head, head.next   #last负责把交换后的两结点和之前已经交换的结点正确连接,prev和cur负责交换两个结点

        while cur:   
            prev.next = cur.next
            cur.next = prev
            last.next = cur 

            last = prev
            prev = prev.next
            cur = prev.next if prev else None
        
        return dummy.next

时间复杂度:O(N)

空间复杂度:O(1)


其他思路:

采用递归方法同样可以解决这个问题。关键在于理解:函数返回的已经是交换完成的链表部分。具体实现时,可以一步到位地完成交换:将新头结点指向当前头结点的下一节点,当前头结点的next指针指向后续已交换好的链表,最后让新头结点的next指针指回头结点即可。

代码如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        #2.递归
        #芝士递归终止条件
        if not head or not head.next:
            return head

        #获取当前结点(1号结点)的下一个结点(2号结点)
        newHead = head.next

        #然后1号结点的next 指向 连接到后面已经完成交换的链表上
        head.next = self.swapPairs(newHead.next)

        #最后2号结点的next 指向 1号结点
        newHead.next = head
        
        return newHead

时间复杂度:O(N)

空间复杂度:O(N)


总结:

①链表常用的解决方法有迭代法递归法

②迭代法有时需要注意头结点的处理,可以通过添加一个哑结点的方式来避免需要特殊处理头结点

③递归法主要是对当前函数输入输出值的理解。比如这里理解输出是输入一个链表的头结点自这个头结点开始已经交换完成的链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萘柰奈

谢谢老板喵

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值