zoukankan      html  css  js  c++  java
  • 链表和双链表的Python实现

    # 单链表

    # 结点
    class Node:
        def __init__(self, data, next_node):
            self.data = data
            self.next_node = next_node
    
    # 创建链表
    class LinkedList:
        def __init__(self, first_node):
            self.first_node = first_node
      # 按索引读取
    def link_read(self, read_index): # 从第一个结点开始 current_node = self.first_node current_index = 0 while current_index < read_index: # 当前索引小于要找的索引,就需要继续顺着链往下找,直至找到我们要找的索引值 current_node = current_node.next_node current_index += 1 # 如果读到最后一个结点之后,就说明所找的索引不在链表中,因此返回None if not current_node: return None return current_node.data
      # 查找值的索引
    def link_search(self, search_value): # 从第一个结点开始 current_node = self.first_node current_index = 0 while current_node.data != search_value: # 如果当前结点的值不是要找的值,就需要继续顺着链往下找,直至找到我们要找的值 current_node = current_node.next_node current_index += 1 # 如果读到最后一个结点之后,就说明所找的值不在链表中,因此返回None if not current_node: return None return current_index
      # 插入
    def link_insert(self, new_data, insert_at_index): # 创建插入的新结点 new_node = Node(new_data, None) # 如果在开头插入, 则将新结点指向原first_node # 并重新设置first_node if insert_at_index == 0: new_node.next_node = node_01 self.first_node = new_node return "insert at start successfully" # 找到新结点插入位置前的那一个结点 current_node = self.first_node current_index = 0 prevent_index = insert_at_index - 1 while current_index < prevent_index: temporary_node = current_node # 当前索引小于要找的索引前一个,就需要继续顺着链往下找,直至找到我们要找的索引值 current_node = current_node.next_node current_index += 1 # 如果要添加的结点超过链表最大索引就插入链表最末尾 if not current_node: current_node = temporary_node break # 当前结点下一个结点是新结点,新结点的下一个结点是当前结点的下一结点 new_node.next_node = current_node.next_node current_node.next_node = new_node return "insert successfully"
      # 删除 def link_delete(self, delete_at_index): # 如果删除的结点是第一个,则只需将first_node重置为第二个结点便可 if delete_at_index == 0: self.first_node = node_02 return node_01.data # 如果删除的结点不是第一个,需要找到要删结点的前一个结点 current_node = self.first_node current_index = 0 prevent_index = delete_at_index - 1 while current_index < prevent_index: temporary_node = current_node current_node = current_node.next_node current_index += 1 # 如果要删除的结点超过链表最大索引就删除链表最末尾的结点 if not current_node.next_node: temporary_node.next_node = None return temporary_node.data # 要删除的结点和要删除结点的后一个结点 delete_node = current_node.next_node after_delete_node = delete_node.next_node # 将要删除结点的前一个结点的next_node指向要删除结点的后一个结点 current_node.next_node = after_delete_node delete_node.next_node = None return delete_node.data if __name__ == '__main__': node_09 = Node("plus", None) node_08 = Node("flay", node_09) node_07 = Node("dump", node_08) node_06 = Node("blog", node_07) node_05 = Node("load", node_06) node_04 = Node("lope", node_05) node_03 = Node("amid", node_04) node_02 = Node("upon", node_03) node_01 = Node("once", node_02) # 将第一个结点node_01作为指针创建链表 link_list = LinkedList(node_01) print(link_list.link_read(5)) print(link_list.link_search("dump")) print(link_list.link_insert("jeep", 12)) print(link_list.link_delete(13))

    # 双链表

    # 结点
    class Node:
        def __init__(self, data):
            self.data = data
            self.previous_node = None
            self.next_node = None
    
    # 创建双链表
    class DoublyLinkedList:
        def __init__(self, first_node, last_node):
            self.first_node = first_node
            self.last_node = last_node
    
        # 在链表末尾插入数据
        def insert_at_end(self, insert_value):
            # 创建新结点
            new_node = Node(insert_value)
            # 如果链表还没有任何结点
            if not self.first_node:
                self.first_node = new_node
                self.last_node = new_node
            else:
                # 否则,将新结点的prevent_node指向链表的原last_node
                new_node.previous_node = self.last_node
                # 将链表的原last_node的next_node指向新结点
                self.last_node.next_node = new_node
                # 将链表的原last_node重新设置为新结点
                self.last_node = new_node
            return new_node.data
    
        # 在链表开头删除数据
        def remove_from_front(self):
            remove_node = self.first_node
            self.first_node = remove_node.next_node
            return remove_node.data
    
    # 基于双链表的队列
    class LinkQueue:
        def __init__(self, first_node, last_node):
            self.link_queue = DoublyLinkedList(first_node, last_node)
        # 入队
        def entry_queue(self, entry_value):
            self.link_queue.insert_at_end(entry_value)
            return str(entry_value) + "入队成功"
        # 出队
        def leave_queue(self):
            remove_node = self.link_queue.remove_from_front()
            return str(remove_node) + "出队成功"
        # 查看队列末尾数据
        def link_tail(self):
            tail_value = self.link_queue.last_node.data
            return tail_value
    
    if __name__ == '__main__':
        node_09 = Node("plus")
        node_08 = Node("flay")
        node_07 = Node("dump")
        node_06 = Node("blog")
        node_05 = Node("load")
        node_04 = Node("lope")
        node_03 = Node("amid")
        node_02 = Node("upon")
        node_01 = Node("once")
        node_01.next_node = node_02
        node_02.previous_node = node_01
        node_02.next_node = node_03
        node_03.previous_node = node_02
        node_03.next_node = node_04
        node_04.previous_node = node_03
        node_04.next_node = node_05
        node_05.previous_node = node_04
        node_05.next_node = node_06
        node_06.previous_node = node_05
        node_06.next_node = node_07
        node_07.previous_node = node_06
        node_07.next_node = node_08
        node_08.previous_node = node_07
        node_08.next_node = node_09
        node_09.previous_node = node_08
    
        # 将第一个结点node_01作为开始指针,将最后一个结点node_09作为结尾指针创建链表
        doubly_link_list = DoublyLinkedList(node_01, node_09)
    
        print(doubly_link_list.insert_at_end("blue"))
        print(doubly_link_list.remove_from_front())
    
        my_queue = LinkQueue(node_01, node_09)
    
        print(my_queue.entry_queue("lazy"))
        print(my_queue.leave_queue())
        print(my_queue.link_tail())
  • 相关阅读:
    2-用EasyNetQ连接RabbitMQ(黄亮翻译)
    1-EasyNetQ介绍(黄亮翻译)
    MVC之——Razor语法
    MVC过滤器的用法
    MVC初级知识之——Routing路由
    MVC初级知识之——View与Controller的讲解
    MVC初级教程(四)
    MVC初级教程(三)
    MVC初级教程(二)
    MVC初级教程(一)
  • 原文地址:https://www.cnblogs.com/glz666/p/13861850.html
Copyright © 2011-2022 走看看