LeetCode第二十四题:两两交换链表中的节点 【python】

简介: 欢迎关注微信公众号 数据分析螺丝钉

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作

作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

python数据分析可视化:企业实战案例

备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

问题描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

示例:

输入:1->2->3->4

输出:2->1->4->3

说明:你不能只是单纯地改变节点内部的值,而是需要实际的进行节点交换。

方法一:迭代法

解题步骤

创建哑节点:创建一个哑节点(dummy node),它的next指针指向链表的头节点。这样可以方便地处理头节点交换的特殊情况,并使得链表操作更加统一。

初始化指针:使用三个指针,prev初始化指向哑节点,curr指向prev.next(即链表的第一个节点),next指向curr.next(即链表的第二个节点)。

1. 遍历和交换节点:确保currnext不为空,因为这是交换的前提。

  • 更新prevnext指向next,实现第一步的节点交换。
  • 更新currnext指向next.next,将交换后的第二个节点连接到后面的节点。
  • nextnext指向curr,完成两节点的交换。
  • 移动prev指针到curr,准备下一对交换。
  • 更新currnext指向下一对可能交换的节点。

2. 返回结果:最终,prev将指向最后一个经过交换的节点,而哑节点的next指针指向新的头节点。返回dummy.next即可。

代码示例

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
def swapPairs(head: ListNode) -> ListNode:
    dummy = ListNode(-1)
    dummy.next = head
    prev = dummy
    while prev.next and prev.next.next:
        curr = prev.next
        next = curr.next
        # Swapping
        prev.next = next
        curr.next = next.next
        next.next = curr
        # Move prev to curr
        prev = curr
    return dummy.next

算法分析

  • 时间复杂度:O(N),其中n是链表中的节点数。这是因为我们需要遍历整个链表来交换每对相邻节点。
  • 空间复杂度:O(1),我们只使用了有限的几个额外指针,不需要额外的空间来存储数据。

方法二:递归方法

解题步骤

1. 递归终止条件:

  • 如果链表为空(没有节点),或者只有一个节点(无法进行交换),递归应该终止。

2. 交换节点:

  • 对于链表的头两个节点,将第二个节点连接到第一个节点前面。

3. 递归函数调用:

  • 对于头两个节点之后的链表部分,递归调用该函数。

4. 连接已交换的部分:

  • 将前面步骤中已经交换好的部分连接到已经处理的链表的后面。

5. 返回值:

  • 每次递归调用应返回新的头节点,即原来的第二个节点。

代码示例

函数

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
def swapPairs(head: ListNode) -> ListNode:
    # 如果链表为空或者只有一个节点,返回原链表
    if not head or not head.next:
        return head
    # 初始化两个节点
    first_node = head
    second_node = head.next
    # 递归处理余下的节点
    first_node.next = swapPairs(second_node.next)
    # 将第一个节点和第二个节点交换
    second_node.next = first_node
    # 返回新的头节点,即原来的第二个节点
    return second_node
# 辅助函数:打印链表
def printList(node):
    while node:
        print(node.val, end=" -> ")
        node = node.next
    print("None")
# 辅助函数:创建链表
def createList(values):
    dummy = ListNode(0)
    current = dummy
    for value in values:
        current.next = ListNode(value)
        current = current.next
    return dummy.next

调试
# 创建链表
input_list = createList([1, 2, 3, 4])
# 应用函数
swapped_list = swapPairs(input_list)
# 打印结果
printList(swapped_list)

输出
2 -> 1 -> 4 -> 3 -> None

算法分析

很抱歉,我无法回答这个问题,因为你没有提供任何文章供我评估。如果你能提供文章的话,我可以帮助你评估其质量。

  • 时间复杂度:O(N),其中 n 是链表中的节点数量。递归方法会访问每个节点一次,进行常数时间的操作(交换两个节点)。
  • 空间复杂度:O(N) 的递归调用栈空间,在最坏的情况下(当链表完全不为空时),递归深度可以达到 n/2 (每次递归处理两个节点)。

结论

如果链表长度不是非常大,或者对代码简洁性有更高要求,可以选择递归方法。

如果需要处理非常长的链表,或者环境对递归深度有严格限制(如某些嵌入式系统或限制了递归深度的编程环境),则迭代方法更为合适

对于实际应用,选择哪种方法(迭代或递归)应根据具体问题的需求和环境的限制来决定。


欢迎关注微信公众号 数据分析螺丝钉

目录
打赏
0
0
0
0
68
分享
相关文章
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A->B->C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
Python 实现单向链表,和单向链表的反转
Python 实现反转、合并链表有啥用?
大家好,我是V哥。本文介绍Python实现反转链表和合并链表的应用场景及代码实现。反转链表适用于时间序列数据展示、回文链表判断等;合并链表则用于大规模数据排序、数据库查询结果集合并等。通过迭代和递归方法实现反转链表,以及合并两个或多个有序链表的算法,帮助开发者解决实际问题。关注V哥,了解更多实用编程技巧。 先赞再看后评论,腰缠万贯财进门。
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
154 0
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
153 2
|
2月前
|
探索 Python 中链表的实现:从基础到高级
链表是一种由节点组成的基础数据结构,每个节点包含数据和指向下一个节点的引用。本文通过Python类实现单向链表,详细介绍了创建、插入、删除节点等操作,并提供示例代码帮助理解。链表在处理动态数据时具有高效性,适用于大量数据变动的场景。文章为初学者提供了全面的入门指南,助你掌握链表的核心概念与应用。
|
5月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
50 0
LeetCode第二十四题(两两交换链表中的节点)
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
7月前
|
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
72 3
|
7月前
|
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
42 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等