日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

基于python實現雙向鏈表_python

作者:旺旺小小超 ? 更新時間: 2022-07-24 編程語言

在一些面試或者力扣題中都要求用雙向鏈表來實現,下面是基于python的雙向鏈表實現。

一、構建鏈表節點

class Node:

? ? def __init__(self, key, value):
? ? ? ? """
? ? ? ? 初始化方法
? ? ? ? :param key:
? ? ? ? :param value:
? ? ? ? """
? ? ? ? self.key = key
? ? ? ? self.value = value
? ? ? ? self.prev = None
? ? ? ? self.next = None

? ? def __str__(self):
? ? ? ? val = '{%s: %s}' % (self.key, self.value)
? ? ? ? return val

? ? def __repr__(self):
? ? ? ? val = '{%s: %s}' % (self.key, self.value)
? ? ? ? return val

除了一些節點的基礎屬性外還有__str__方法用于自定義print(node)的字符串描述(類似Java的toString()),__repr__用于自定義直接調用Node類時的字符串描述

二、實現鏈表類

具體邏輯主要包括頭部添加、尾部添加、頭部刪除、尾部刪除和任意節點的刪除,所有對雙向鏈表的操作都是基于這幾個方法實現的,具體流程都寫在注釋中了

class DoubleLinkedList:

? ? def __init__(self, capacity=0xffffffff):
? ? ? ? """
? ? ? ? 雙向鏈表
? ? ? ? :param capacity: 鏈表容量 初始化為int的最大值2^32-1
? ? ? ? :return:
? ? ? ? """
? ? ? ? self.capacity = capacity
? ? ? ? self.size = 0
? ? ? ? self.head = None
? ? ? ? self.tail = None

? ? def __add_head(self, node):
? ? ? ? """
? ? ? ? 向鏈表頭部添加節點
? ? ? ? ? ? 頭部節點不存在 新添加節點為頭部和尾部節點
? ? ? ? ? ? 頭部節點已存在 新添加的節點為新的頭部節點
? ? ? ? :param node: 要添加的節點
? ? ? ? :return: 已添加的節點
? ? ? ? """
? ? ? ? # 頭部節點為空
? ? ? ? if not self.head:
? ? ? ? ? ? self.head = node
? ? ? ? ? ? self.tail = node
? ? ? ? ? ? self.head.next = None
? ? ? ? ? ? self.tail.prev = None
? ? ? ? # 頭部節點不為空
? ? ? ? else:
? ? ? ? ? ? node.next = self.head
? ? ? ? ? ? self.head.prev = node
? ? ? ? ? ? self.head = node
? ? ? ? ? ? self.head.prev = None
? ? ? ? self.size += 1

? ? ? ? return node

? ? def __add_tail(self, node):
? ? ? ? """
? ? ? ? 向鏈表尾部添加節點
? ? ? ? ? ? 尾部節點不存在 新添加的節點為頭部和尾部節點
? ? ? ? ? ? 尾部節點已存在 新添加的節點為新的尾部節點
? ? ? ? :param node: 添加的節點
? ? ? ? :return: 已添加的節點
? ? ? ? """
? ? ? ? # 尾部節點為空
? ? ? ? if not self.tail:
? ? ? ? ? ? self.tail = node
? ? ? ? ? ? self.head = node
? ? ? ? ? ? self.head.next = None
? ? ? ? ? ? self.tail.prev = None
? ? ? ? # 尾部節點不為空
? ? ? ? else:
? ? ? ? ? ? node.prev = self.tail
? ? ? ? ? ? self.tail.next = node
? ? ? ? ? ? self.tail = node
? ? ? ? ? ? self.tail.next = None
? ? ? ? self.size += 1

? ? ? ? return node

? ? def __remove_head(self):
? ? ? ? """
? ? ? ? 刪除頭部節點
? ? ? ? ? ? 頭部節點不存在 返回None
? ? ? ? ? ? 頭部節點已存在 判斷鏈表節點數量 刪除頭部節點
? ? ? ? :return: 頭部節點
? ? ? ? """
? ? ? ? # 頭部節點不存在
? ? ? ? if not self.head:
? ? ? ? ? ? return None

? ? ? ? # 鏈表至少存在兩個節點
? ? ? ? head = self.head
? ? ? ? if head.next:
? ? ? ? ? ? head.next.prev = None
? ? ? ? ? ? self.head = head.next
? ? ? ? # 只存在頭部節點
? ? ? ? else:
? ? ? ? ? ? self.head = self.tail = None
? ? ? ? self.size -= 1

? ? ? ? return head

? ? def __remove_tail(self):
? ? ? ? """
? ? ? ? 刪除尾部節點
? ? ? ? ? ? 尾部節點不存在 返回None
? ? ? ? ? ? 尾部節點已存在 判斷鏈表節點數量 刪除尾部節點
? ? ? ? :return: 尾部節點
? ? ? ? """
? ? ? ? # 尾部節點不存在
? ? ? ? if not self.tail:
? ? ? ? ? ? return None

? ? ? ? # 鏈表至少存在兩個節點
? ? ? ? tail = self.tail
? ? ? ? if tail.prev:
? ? ? ? ? ? tail.prev.next = None
? ? ? ? ? ? self.tail = tail.prev
? ? ? ? # 只存在尾部節點
? ? ? ? else:
? ? ? ? ? ? self.head = self.tail = None
? ? ? ? self.size -= 1

? ? ? ? return tail

? ? def __remove(self, node):
? ? ? ? """
? ? ? ? 刪除任意節點
? ? ? ? ? ? 被刪除的節點不存在 默認刪除尾部節點
? ? ? ? ? ? 刪除頭部節點
? ? ? ? ? ? 刪除尾部節點
? ? ? ? ? ? 刪除其他節點
? ? ? ? :param node: 被刪除的節點
? ? ? ? :return: 被刪除的節點
? ? ? ? """
? ? ? ? # 被刪除的節點不存在
? ? ? ? if not node:
? ? ? ? ? ? node = self.tail

? ? ? ? # 刪除的是頭部節點
? ? ? ? if node == self.head:
? ? ? ? ? ? self.__remove_head()
? ? ? ? # 刪除的是尾部節點
? ? ? ? elif node == self.tail:
? ? ? ? ? ? self.__remove_tail()
? ? ? ? # 刪除的既不是頭部也不是尾部節點
? ? ? ? else:
? ? ? ? ? ? node.next.prev = node.prev
? ? ? ? ? ? node.prev.next = node.next
? ? ? ? ? ? self.size -= 1

? ? ? ? return node

? ? def pop(self):
? ? ? ? """
? ? ? ? 彈出頭部節點
? ? ? ? :return: 頭部節點
? ? ? ? """
? ? ? ? return self.__remove_head()

? ? def append(self, node):
? ? ? ? """
? ? ? ? 添加尾部節點
? ? ? ? :param node: 待追加的節點
? ? ? ? :return: 尾部節點
? ? ? ? """
? ? ? ? return self.__add_tail(node)

? ? def append_front(self, node):
? ? ? ? """
? ? ? ? 添加頭部節點
? ? ? ? :param node: 待添加的節點
? ? ? ? :return: 已添加的節點
? ? ? ? """
? ? ? ? return self.__add_head(node)

? ? def remove(self, node=None):
? ? ? ? """
? ? ? ? 刪除任意節點
? ? ? ? :param node: 待刪除的節點
? ? ? ? :return: 已刪除的節點
? ? ? ? """
? ? ? ? return self.__remove(node)

? ? def print(self):
? ? ? ? """
? ? ? ? 打印當前鏈表
? ? ? ? :return:
? ? ? ? """
? ? ? ? node = self.head
? ? ? ? line = ''
? ? ? ? while node:
? ? ? ? ? ? line += '%s' % node
? ? ? ? ? ? node = node.next
? ? ? ? ? ? if node:
? ? ? ? ? ? ? ? line += '=>'
? ? ? ? print(line)

三、測試邏輯

if __name__ == '__main__':
? ? double_linked_list = DoubleLinkedList(10)
? ? nodes = []
? ? # 構建十個節點的雙向列表
? ? for i in range(10):
? ? ? ? node_item = Node(i, i)
? ? ? ? nodes.append(node_item)

? ? double_linked_list.append(nodes[0])
? ? double_linked_list.print()
? ? double_linked_list.append(nodes[1])
? ? double_linked_list.print()
? ? double_linked_list.pop()
? ? double_linked_list.print()
? ? double_linked_list.append_front(nodes[2])
? ? double_linked_list.print()
? ? double_linked_list.append(nodes[3])
? ? double_linked_list.print()
? ? double_linked_list.remove(nodes[3])
? ? double_linked_list.print()
? ? double_linked_list.remove()
? ? double_linked_list.print()

測試結果:

原文鏈接:https://blog.csdn.net/wang_xiaowang/article/details/105911411

欄目分類
最近更新