首页 > 编程语言 > 详细

链表和双链表的Python实现

时间:2020-10-23 09:40:47      阅读:28      评论:0      收藏:0      [点我收藏+]

# 单链表

# 结点
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())

 

链表和双链表的Python实现

原文:https://www.cnblogs.com/glz666/p/13861850.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!