题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
总结:先将所需的节点单独取出,再将其按所需连接,最后与链表剩下部分进行连接以及遍历。
思路分析
- 每次交换必须有两个节点:这意味着只有当
pre和cur节点存在时,我们才能进行交换。 - 虚拟头节点的引入:为了简化链表头部的交换,我们引入一个虚拟头节点
res,它指向链表的实际头节点。这样可以避免处理链表头部的特殊情况。(res -> 1 -> 2 -> 3 -> 4) - 定义交换过程: 交换的核心思想是将每一对相邻的节点进行反转。
-
通过
pre指针,保存当前交换前的节点,以及两个节点后一个节点t。 -
保存当前要交换的两个节点(
cur和post)。 -
交换这两个节点的位置,更新它们的
next指向正确的位置。 -
记录并更新
pre指针,以便在下一轮继续交换。
-
- 更新
pre指针: 每次交换完一对节点后,我们需要更新pre指针,指向刚才交换后的第二个节点(即原post节点)。然后进入下一轮交换。
Python代码实现
# 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]
"""
res=ListNode(next=head)
pre=res
while pre.next and pre.next.next:
cur,post=pre.next,pre.next.next
t=post.next
pre.next=post
post.next=cur
cur.next=t
pre=pre.next.next
return res.next