<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在一些面試或者力扣題中都要求用雙向連結串列來實現,下面是基於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()
測試結果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45