最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于python實(shí)現(xiàn)雙向鏈表

 更新時(shí)間:2022年05月25日 13:02:16   作者:旺旺小小超  
這篇文章主要為大家詳細(xì)介紹了基于python實(shí)現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在一些面試或者力扣題中都要求用雙向鏈表來(lái)實(shí)現(xiàn),下面是基于python的雙向鏈表實(shí)現(xiàn)。

一、構(gòu)建鏈表節(jié)點(diǎn)

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

除了一些節(jié)點(diǎn)的基礎(chǔ)屬性外還有__str__方法用于自定義print(node)的字符串描述(類似Java的toString()),__repr__用于自定義直接調(diào)用Node類時(shí)的字符串描述

二、實(shí)現(xiàn)鏈表類

具體邏輯主要包括頭部添加、尾部添加、頭部刪除、尾部刪除和任意節(jié)點(diǎn)的刪除,所有對(duì)雙向鏈表的操作都是基于這幾個(gè)方法實(shí)現(xiàn)的,具體流程都寫(xiě)在注釋中了

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):
? ? ? ? """
? ? ? ? 向鏈表頭部添加節(jié)點(diǎn)
? ? ? ? ? ? 頭部節(jié)點(diǎn)不存在 新添加節(jié)點(diǎn)為頭部和尾部節(jié)點(diǎn)
? ? ? ? ? ? 頭部節(jié)點(diǎn)已存在 新添加的節(jié)點(diǎn)為新的頭部節(jié)點(diǎn)
? ? ? ? :param node: 要添加的節(jié)點(diǎn)
? ? ? ? :return: 已添加的節(jié)點(diǎn)
? ? ? ? """
? ? ? ? # 頭部節(jié)點(diǎn)為空
? ? ? ? if not self.head:
? ? ? ? ? ? self.head = node
? ? ? ? ? ? self.tail = node
? ? ? ? ? ? self.head.next = None
? ? ? ? ? ? self.tail.prev = None
? ? ? ? # 頭部節(jié)點(diǎn)不為空
? ? ? ? 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):
? ? ? ? """
? ? ? ? 向鏈表尾部添加節(jié)點(diǎn)
? ? ? ? ? ? 尾部節(jié)點(diǎn)不存在 新添加的節(jié)點(diǎn)為頭部和尾部節(jié)點(diǎn)
? ? ? ? ? ? 尾部節(jié)點(diǎn)已存在 新添加的節(jié)點(diǎn)為新的尾部節(jié)點(diǎn)
? ? ? ? :param node: 添加的節(jié)點(diǎn)
? ? ? ? :return: 已添加的節(jié)點(diǎn)
? ? ? ? """
? ? ? ? # 尾部節(jié)點(diǎn)為空
? ? ? ? if not self.tail:
? ? ? ? ? ? self.tail = node
? ? ? ? ? ? self.head = node
? ? ? ? ? ? self.head.next = None
? ? ? ? ? ? self.tail.prev = None
? ? ? ? # 尾部節(jié)點(diǎn)不為空
? ? ? ? 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):
? ? ? ? """
? ? ? ? 刪除頭部節(jié)點(diǎn)
? ? ? ? ? ? 頭部節(jié)點(diǎn)不存在 返回None
? ? ? ? ? ? 頭部節(jié)點(diǎn)已存在 判斷鏈表節(jié)點(diǎn)數(shù)量 刪除頭部節(jié)點(diǎn)
? ? ? ? :return: 頭部節(jié)點(diǎn)
? ? ? ? """
? ? ? ? # 頭部節(jié)點(diǎn)不存在
? ? ? ? if not self.head:
? ? ? ? ? ? return None

? ? ? ? # 鏈表至少存在兩個(gè)節(jié)點(diǎn)
? ? ? ? head = self.head
? ? ? ? if head.next:
? ? ? ? ? ? head.next.prev = None
? ? ? ? ? ? self.head = head.next
? ? ? ? # 只存在頭部節(jié)點(diǎn)
? ? ? ? else:
? ? ? ? ? ? self.head = self.tail = None
? ? ? ? self.size -= 1

? ? ? ? return head

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

? ? ? ? # 鏈表至少存在兩個(gè)節(jié)點(diǎn)
? ? ? ? tail = self.tail
? ? ? ? if tail.prev:
? ? ? ? ? ? tail.prev.next = None
? ? ? ? ? ? self.tail = tail.prev
? ? ? ? # 只存在尾部節(jié)點(diǎn)
? ? ? ? else:
? ? ? ? ? ? self.head = self.tail = None
? ? ? ? self.size -= 1

? ? ? ? return tail

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

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

? ? ? ? return node

? ? def pop(self):
? ? ? ? """
? ? ? ? 彈出頭部節(jié)點(diǎn)
? ? ? ? :return: 頭部節(jié)點(diǎn)
? ? ? ? """
? ? ? ? return self.__remove_head()

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

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

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

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

三、測(cè)試邏輯

if __name__ == '__main__':
? ? double_linked_list = DoubleLinkedList(10)
? ? nodes = []
? ? # 構(gòu)建十個(gè)節(jié)點(diǎn)的雙向列表
? ? 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()

測(cè)試結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)短網(wǎng)址ShortUrl的Hash運(yùn)算實(shí)例講解

    Python實(shí)現(xiàn)短網(wǎng)址ShortUrl的Hash運(yùn)算實(shí)例講解

    這篇文章主要介紹了Python實(shí)現(xiàn)短網(wǎng)址ShortUrl的Hash運(yùn)算,較為詳細(xì)的分析了Python短網(wǎng)址運(yùn)算的算法原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-08-08
  • Django中在xadmin中集成DjangoUeditor過(guò)程詳解

    Django中在xadmin中集成DjangoUeditor過(guò)程詳解

    這篇文章主要介紹了Django中在xadmin中集成DjangoUeditor過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python調(diào)用http-post接口的實(shí)現(xiàn)方式

    Python調(diào)用http-post接口的實(shí)現(xiàn)方式

    這篇文章主要介紹了Python調(diào)用http-post接口的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python中的編碼和解碼及\x和\u問(wèn)題

    python中的編碼和解碼及\x和\u問(wèn)題

    這篇文章主要介紹了python中的編碼和解碼及\x和\u問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python的Geopy庫(kù)處理地理編碼與位置信息

    Python的Geopy庫(kù)處理地理編碼與位置信息

    地理編碼和位置信息在現(xiàn)代應(yīng)用中扮演著重要角色,本文主要介紹了Python的Geopy庫(kù)處理地理編碼與位置信息,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Python使用cProfile進(jìn)行性能分析

    Python使用cProfile進(jìn)行性能分析

    cProfile是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,用于收集代碼的性能數(shù)據(jù),這篇文章主要為大家詳細(xì)介紹了如何使用cProfile進(jìn)行性能分析,需要的可以參考下
    2024-12-12
  • Anaconda第三方庫(kù)下載慢的解決方法

    Anaconda第三方庫(kù)下載慢的解決方法

    本文主要介紹了Anaconda第三方庫(kù)下載慢的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Python學(xué)習(xí)筆記之open()函數(shù)打開(kāi)文件路徑報(bào)錯(cuò)問(wèn)題

    Python學(xué)習(xí)筆記之open()函數(shù)打開(kāi)文件路徑報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了Python學(xué)習(xí)筆記之open()函數(shù)打開(kāi)文件路徑報(bào)錯(cuò)問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Numpy一維線性插值函數(shù)的用法

    Numpy一維線性插值函數(shù)的用法

    這篇文章主要介紹了Numpy一維線性插值函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Keras中的多分類損失函數(shù)用法categorical_crossentropy

    Keras中的多分類損失函數(shù)用法categorical_crossentropy

    這篇文章主要介紹了Keras中的多分類損失函數(shù)用法categorical_crossentropy,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06

最新評(píng)論

静安区| 胶南市| 保定市| 双桥区| 确山县| 西峡县| 明星| 浦北县| 浦城县| 锡林郭勒盟| 高淳县| 长乐市| 甘洛县| 南陵县| 五华县| 江华| 炎陵县| 永昌县| 县级市| 油尖旺区| 中牟县| 甘洛县| 南乐县| 海盐县| 上饶市| 东安县| 道孚县| 乐业县| 丘北县| 茌平县| 平阴县| 石柱| 高陵县| 玛曲县| 光山县| 准格尔旗| 乾安县| 北碚区| 赣榆县| 富阳市| 罗城|