1 题目
2 思路
关键步骤:
- 虚拟头节点 (fake_head):
• 使用虚拟头节点的目的是为了简化对链表头节点的操作。尤其是在链表的头部有交换操作时,虚拟头节点可以避免直接修改 head 节点。
• fake_head 被初始化为一个 ListNode,其值为 -1,它指向链表的实际头节点 head。 - 初始化指针:
• prev 指向虚拟头节点 fake_head,它的作用是帮助追踪当前需要交换节点的前一个节点。
• p1 指向链表的第一个节点,即链表的实际头节点。 - 交换节点:
• 使用 while p1 and p1.next 遍历链表,确保每一对相邻节点都能被交换。
• 对于每一对相邻的节点 p1 和 p2(p1 是当前节点,p2 是 p1.next),我们执行以下步骤: - 获取 p1.next(即 p2)和 p2.next(即 next_node)。
- 交换节点:
• prev.next = p2:将 prev 的 next 指向 p2,这是交换操作的一部分。
• p2.next = p1:让 p2 指向 p1,完成这一对节点的交换。
• p1.next = next_node:将 p1 指向 next_node,即保持链表的继续连接。 - 移动指针:
• p1 = next_node:将 p1 移动到交换后的下一个节点。
• prev = prev.next.next:prev 向前移动两步,因为 prev 在当前交换后要跳过已经交换的两个节点,指向下一个未交换的节点。 - 返回结果:
• 最后,返回从 fake_head.next 开始的链表,这就是完成交换后的链表。fake_head 节点本身是一个虚拟节点,所以我们跳过它,直接返回它的下一个节点。
3 AC代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def swapPairs(self, head):
"""
:type head: Optional[ListNode]
:rtype: Optional[ListNode]
"""
if head is None:
return head
fake_head = ListNode(-1) #增加一个虚表头
fake_head.next = head
prev = fake_head
p1 = head
while p1 and p1.next:
p2 = p1.next#获得需要交换的节点
next_node = p2.next #获得链表要断开的后续节点
#开始重新链接
prev.next = p2
p2.next = p1
p1.next = next_node
#移动指针
p1 = next_node
prev = prev.next.next
return fake_head.next