1图解
2 代码及分析
# 24. 两两交换链表中的节点
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# 本题设置pre,cur和post的概念,本质上是准备将cur和post交换,所以添加virtual头节点本意也就是将第一个元素作为cur和第二个元素post交换
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
res = ListNode(next=head) # 按照node的类创建了一个新的头节点,目的是为了让这个头节点未来指向next.next(这个理解错误)
# res的创建就是作为一个虚拟头节点,并指向真实的链表,未来返回时直接返回res.next
pre = res # 这一步是非常重要的,相当于链表中的指针,未来不停的向后移动对链表进行改动
# 这一步相当于说,现在的pre指针针对的就是当前链表的虚拟头节点
while pre.next and pre.next.next: # 只有当pre这个指针的下一个存在,且下下一个存在,不是None的时候,才有交换的元素
cur = pre.next # pre cur post 最左 中间 最右; 定义cur就是pre的next没问题
post = pre.next.next # 定义post就是pre的next.next 没问题
cur.next = post.next # 第一步,让原来的cur的next断开变成post的next
post.next = cur # 第二步,原来post的next变为cur或者per的next
pre.next = post # 第三步,pre的next变为post
pre = pre.next.next # 向后移动两位,准备下一次交换
return res.next
if __name__ == "__main__":
data = ListNode(1)
data.next = ListNode(2)
data.next.next = ListNode(3)
data.next.next.next = ListNode(4)
a = Solution()
print(a.swapPairs(data))
# a = Solution()
# list = [1, 2, 3, 4]
# data = ListNode()
# for i in list:
# data.val = i
# data = data.next
#
# result = a.swapPairs(data)
# print(result.val)
# while result.next:
# print(result.next)
# result = result.next
# again 简化版
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
virtual = ListNode(next=head)
pre = virtual
while pre.next and pre.next.next:
cur = pre.next
post = pre.next.next
# 核心三步
cur.next = post.next # 这里post.next也可以是cur.next.next,都一样
post.next = pre.next # 注意这里看图有多种写法,写post.next = cur也行,因为cur就是pre的next
pre.next = post
# 移动pre指针,重新定义cur和post去,相当于施工队
pre = pre.next.next
return virtual.next
3 简化版
只用pre和post,不用cur
# 尝试换种写法写三步,不用cur!只用pre和post,简化了cur的概念
# 三步写法
# pre.next.next = pre.next.next.next
# post.next = pre.next
# pre.next = post
# 完整版
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
virtual = ListNode(next=head)
pre = virtual
while pre.next and pre.next.next:
post = pre.next.next # 只需要定义post即可
# 核心三步
pre.next.next = pre.next.next.next
post.next = pre.next
pre.next = post
# 指针位移
pre = pre.next.next
return virtual.next