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)
总结:
①链表常用的解决方法有迭代法和递归法
②迭代法有时需要注意头结点的处理,可以通过添加一个哑结点的方式来避免需要特殊处理头结点
③递归法主要是对当前函数输入输出值的理解。比如这里理解输出是输入一个链表的头结点后自这个头结点开始已经交换完成的链表

&spm=1001.2101.3001.5002&articleId=149645442&d=1&t=3&u=818080482cfa4b8db602002651aaba2c)
233

被折叠的 条评论
为什么被折叠?



