leetcode_24_两两交换链表中的节点_python_图解

本文通过图解和代码分析讲解LeetCode第24题,如何使用Python实现两两交换链表中的节点,简化版解法仅使用pre和post指针,不涉及cur指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值