当前位置: 首页 > news >正文

用Python实现的双向链表类,包含了头插、尾插、归并排序等功能


 下面是一个用Python实现的双向链表类,包含了头插、尾插、归并排序等功能。这个类还包含了基本的链表操作,如插入、删除、遍历等。

  
下面是一个用Python实现的双向链表类,包含了头插、尾插、归并排序等功能。这个类还包含了基本的链表操作,如插入、删除、遍历等。
class Node:
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def is_empty(self):
        return self.head is None

    def insert_at_head(self, data):
        new_node = Node(data)
        if self.is_empty():
            self.head = self.tail = new_node
        else:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node

    def insert_at_tail(self, data):
        new_node = Node(data)
        if self.is_empty():
            self.head = self.tail = new_node
        else:
            new_node.prev = self.tail
            self.tail.next = new_node
            self.tail = new_node

    def delete_at_head(self):
        if self.is_empty():
            return None
        data = self.head.data
        if self.head == self.tail:
            self.head = self.tail = None
        else:
            self.head = self.head.next
            self.head.prev = None
        return data

    def delete_at_tail(self):
        if self.is_empty():
            return None
        data = self.tail.data
        if self.head == self.tail:
            self.head = self.tail = None
        else:
            self.tail = self.tail.prev
            self.tail.next = None
        return data

    def print_list(self):
        current = self.head
        while current:
            print(current.data, end=" <-> ")
            current = current.next
        print("None")

    def get_middle(self, head):
        if head is None:
            return head
        slow = head
        fast = head
        while fast.next and fast.next.next:
            slow = slow.next
            fast = fast.next.next
        return slow

    def merge(self, left, right):
        if left is None:
            return right
        if right is None:
            return left

        if left.data <= right.data:
            result = left
            result.next = self.merge(left.next, right)
            result.next.prev = result
        else:
            result = right
            result.next = self.merge(left, right.next)
            result.next.prev = result
        return result

    def merge_sort(self, head):
        if head is None or head.next is None:
            return head

        middle = self.get_middle(head)
        next_to_middle = middle.next

        middle.next = None
        next_to_middle.prev = None

        left = self.merge_sort(head)
        right = self.merge_sort(next_to_middle)

        sorted_list = self.merge(left, right)
        return sorted_list

    def sort(self):
        self.head = self.merge_sort(self.head)
        # Update the tail after sorting
        current = self.head
        while current and current.next:
            current = current.next
        self.tail = current

# Example usage:
dll = DoublyLinkedList()
dll.insert_at_tail(3)
dll.insert_at_tail(1)
dll.insert_at_tail(4)
dll.insert_at_tail(2)

print("Original list:")
dll.print_list()

dll.sort()
print("Sorted list:")
dll.print_list()

dll.insert_at_head(5)
print("After inserting 5 at head:")
dll.print_list()

dll.insert_at_tail(0)
print("After inserting 0 at tail:")
dll.print_list()

代码说明:
Node类:表示双向链表中的一个节点,包含数据、前驱指针和后继指针。
DoublyLinkedList类:表示双向链表,包含头节点和尾节点。
insert_at_head(data):在链表头部插入一个节点。
insert_at_tail(data):在链表尾部插入一个节点。
delete_at_head():删除链表头部的节点。
delete_at_tail():删除链表尾部的节点。
print_list():打印链表中的所有节点。
get_middle(head):找到链表的中间节点,用于归并排序。
merge(left, right):合并两个有序链表。
merge_sort(head):递归地对链表进行归并排序。
sort():对链表进行排序,并更新尾节点。
示例:
创建一个双向链表并插入一些数据。
对链表进行排序。
在链表头部和尾部插入新节点,并打印链表。
你可以根据需要扩展或修改这个类。


Original list:
3 <-> 1 <-> 4 <-> 2 <-> None
Sorted list:
1 <-> 2 <-> 3 <-> 4 <-> None
After inserting 5 at head:
5 <-> 1 <-> 2 <-> 3 <-> 4 <-> None
After inserting 0 at tail:
5 <-> 1 <-> 2 <-> 3 <-> 4 <-> 0 <-> None

http://www.dtcms.com/a/32019.html

相关文章:

  • 再探动态规划--背包问题
  • 听懂 弦外之音
  • C++算法基础笔记
  • C++STL容器之set
  • IEEE 会议论文作者信息Latex模板
  • 【Bluedroid】AVRCP 连接源码分析(一)
  • VUE四:Vue-cli
  • flink系列之:使用flink cdc3从mysql数据库同步数据到doris和starrocks
  • QEMU源码全解析 —— 内存虚拟化(17)
  • 计算机网络-面试总结
  • 常用高压缩率的视频容器格式,并进行大比例压缩
  • Windows 上源码安装 FastGPT
  • S7-1200如何利用时钟存储器做震荡电路
  • QQ登录测试用例报告
  • 大模型SFT有监督微调教程
  • Java Web开发实战与项目——开发一个在线论坛系统
  • 在其他位置调用Static结构
  • mysql之事务深度解析与实战应用:保障数据一致性的基石
  • PTA:运用顺序表实现多项式相加
  • 【洛谷排序算法】P1012拼数-详细讲解
  • BFS 和 DFS(深度优先搜索、广度优先搜索)
  • 【超详细】神经网络的可视化解释
  • 优品指标树
  • 【项目设计】自主HTTP服务器
  • 爬虫小案例csv写入
  • 【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】
  • 1.27作业
  • C语言的内存分配:malloc和free
  • 【精调】LLaMA-Factory 快速开始4 自定义个一个sharegpt数据集并训练
  • 使用 C++ 和 gRPC 的常见陷阱及解决方案