Python 实现反转、合并链表有啥用?

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

大家好,我是 V 哥。使用 Python 实现反转链表、合并链表在开辟中比较常见,我们先来看看各自的应用场景。先赞再看后评论,腰缠万贯财进门。

  • 反转链表
比如,在处置惩罚时间序列数据时,有时需要将历史数据按照时间从近到远的顺序展示,如果数据是以链表形式存储的,通过反转链表可以高效地实现这一需求。再比如,判断一个链表是否为回文链表(即链表正序和逆序遍历的值相同)时,可以先反转链表的后半部分,然后与前半部分进行比较。再比如,在图像处置惩罚中,有时需要对图像进行水平或垂直翻转。如果图像数据以链表形式存储(例如,链表中的每个节点代表图像的一个像素),反转链表可以实现图像的水平翻转。

  • 合并链表
比如,在大规模数据排序中,当数据量太大无法一次性加载到内存中时,可以采用多路归并排序算法。该算法将数据分成多个小块,分别排序后得到多个有序链表,然后通过合并这些有序链表得到最终的有序结果。合并链表是多路归并排序的核心操作之一。在数据库中,当实验多个查询操作并得到多个有序结果集时,需要将这些结果聚集并成一个有序的结果集。如果这些结果集以链表形式存储,合并链表可以高效地完成这个任务。在多媒体处置惩罚中,有时需要将多个音视频流合并成一个流。如果每个音视频流的数据以链表形式存储,合并链表可以实现音视频流的合并。
相识完反转链表和合并链表的应用场景,是不是跟 V 哥一样,这玩意儿还真挺有用的,那接下来,V 哥就具体介绍一个反转链表和合并链表。
反转链表

先看在 Python 中实现反转链表,我们可以使用迭代和递归两种方法。下面分别给出这两种方法的具体实现。
迭代方法

迭代方法的核心思想是遍历链表,在遍历过程中改变每个节点的指针方向,使其指向前一个节点。
  1. # 定义链表节点类
  2. class ListNode:
  3.     def __init__(self, val=0, next=None):
  4.         self.val = val
  5.         self.next = next
  6. def reverseList(head):
  7.     # 初始化前一个节点为 None
  8.     prev = None
  9.     # 当前节点指向头节点
  10.     curr = head
  11.     while curr:
  12.         # 保存当前节点的下一个节点
  13.         next_node = curr.next
  14.         # 将当前节点的指针指向前一个节点
  15.         curr.next = prev
  16.         # 前一个节点移动到当前节点
  17.         prev = curr
  18.         # 当前节点移动到下一个节点
  19.         curr = next_node
  20.     # 最终 prev 指向反转后的头节点
  21.     return prev
  22. # 辅助函数:将列表转换为链表
  23. def list_to_linked_list(lst):
  24.     dummy = ListNode(0)
  25.     current = dummy
  26.     for val in lst:
  27.         current.next = ListNode(val)
  28.         current = current.next
  29.     return dummy.next
  30. # 辅助函数:将链表转换为列表
  31. def linked_list_to_list(head):
  32.     result = []
  33.     current = head
  34.     while current:
  35.         result.append(current.val)
  36.         current = current.next
  37.     return result
  38. # 测试代码
  39. input_list = [1, 2, 3, 4, 5]
  40. head = list_to_linked_list(input_list)
  41. reversed_head = reverseList(head)
  42. output_list = linked_list_to_list(reversed_head)
  43. print(output_list)  # 输出: [5, 4, 3, 2, 1]
复制代码
递归方法

递归方法的核心思想是先递归地反转当前节点之后的链表,然后将当前节点的指针指向前一个节点。
  1. # 定义链表节点类
  2. class ListNode:
  3.     def __init__(self, val=0, next=None):
  4.         self.val = val
  5.         self.next = next
  6. def reverseList(head):
  7.     # 如果链表为空或只有一个节点,直接返回头节点
  8.     if not head or not head.next:
  9.         return head
  10.     # 递归地反转当前节点之后的链表
  11.     new_head = reverseList(head.next)
  12.     # 将当前节点的下一个节点的指针指向当前节点
  13.     head.next.next = head
  14.     # 将当前节点的指针置为 None
  15.     head.next = None
  16.     return new_head
  17. # 辅助函数:将列表转换为链表
  18. def list_to_linked_list(lst):
  19.     dummy = ListNode(0)
  20.     current = dummy
  21.     for val in lst:
  22.         current.next = ListNode(val)
  23.         current = current.next
  24.     return dummy.next
  25. # 辅助函数:将链表转换为列表
  26. def linked_list_to_list(head):
  27.     result = []
  28.     current = head
  29.     while current:
  30.         result.append(current.val)
  31.         current = current.next
  32.     return result
  33. # 测试代码
  34. input_list = [1, 2, 3, 4, 5]
  35. head = list_to_linked_list(input_list)
  36. reversed_head = reverseList(head)
  37. output_list = linked_list_to_list(reversed_head)
  38. print(output_list)  # 输出: [5, 4, 3, 2, 1]
复制代码
以上两种方法都可以实现链表的反转,迭代方法的时间复杂度是 $O(n)$,空间复杂度是 $O(1)$;递归方法的时间复杂度也是 $O(n)$,但空间复杂度是 $O(n)$,主要是递归调用栈的开销。
使用 Python 实现链表的合并

在 Python 中实现链表的合并,常见的情况有合并两个有序链表和合并多个有序链表,下面分别介绍这两种情况的实现方法。
合并两个有序链表

合并两个有序链表的思绪是比较两个链表当前节点的值,将较小值的节点添加到结果链表中,然后移动相应链表的指针,直到其中一个链表遍历完,最后将另一个链表剩余的部分直接连接到结果链表的末尾。
[code]# 定义链表节点类class ListNode:    def __init__(self, val=0, next=None):        self.val = val        self.next = nextdef mergeTwoLists(l1, l2):    # 创建一个虚拟头节点    dummy = ListNode(0)    # 当前节点指针,初始指向虚拟头节点    current = dummy    while l1 and l2:        if l1.val
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表