24.两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
题解
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
p = head
if not p: # 没有节点
return p
q = p.next
if not q: # 只有一个节点
return p
# 最初两个节点的交换
p.next = q.next
q.next = p
head = q # 找对头,交换后,原来的头变成第二了
# 后续节点交换
while q:
l = p
p = p.next
if not p: # 偶数个节点,p先轮空
return head
q = p.next
if not q: # 奇数个节点,q先轮空
return head
l.next = q
p.next = q.next
q.next = p
return head # 多余的
思路
找规律。使用两个指针指向需要交换的node,示例1中,p指向1,q指向2,令他们交换位置;交换玩后,变成q在前p在后;这时,令p向后移动一个,q继续指向p的后一个node;思考到这里就找到循环的规律了。
接着就是细节,最初两个节点的交换和后面不一样,单独写出来;当节点数为偶数时,会先出现p指针轮空,单节点数为奇数时,是q指针先轮空,所以合适的地方加上判定。