網(wǎng)站首頁 編程語言 正文
雙向鏈表
一種更復雜的鏈表是“雙向鏈表”或“雙面鏈表”。每個節(jié)點有兩個鏈接:一個指向前一個節(jié)點,當此節(jié)點為第一個節(jié)點時,指向空值;而另一個指向下一個節(jié)點,當此節(jié)點為最后一個節(jié)點時,指向空值。
操作
is_empty() 鏈表是否為空
length() 鏈表長度
travel() 遍歷鏈表
add(item) 鏈表頭部添加
append(item) 鏈表尾部添加
insert(pos, item) 指定位置添加
remove(item) 刪除節(jié)點
search(item) 查找節(jié)點是否存在
實現(xiàn)
class Node(object):
? ? """雙向鏈表節(jié)點"""
? ? def __init__(self, item):
? ? ? ? self.item = item
? ? ? ? self.next = None
? ? ? ? self.prev = None
class DLinkList(object):
? ? """雙向鏈表"""
? ? def __init__(self):
? ? ? ? self.__head = None
? ? def is_empty(self):
? ? ? ? """判斷鏈表是否為空"""
? ? ? ? return self.__head == None
? ? def length(self):
? ? ? ? """返回鏈表的長度"""
? ? ? ? cur = self.__head
? ? ? ? count = 0
? ? ? ? while cur != None:
? ? ? ? ? ? count += 1
? ? ? ? ? ? cur = cur.next
? ? ? ? return count
? ? def travel(self):
? ? ? ? """遍歷鏈表"""
? ? ? ? cur = self.__head
? ? ? ? while cur != None:
? ? ? ? ? ? print cur.item,
? ? ? ? ? ? cur = cur.next
? ? ? ? print ""
? ? def add(self, item):
? ? ? ? """頭部插入元素"""
? ? ? ? node = Node(item)
? ? ? ? if self.is_empty():
? ? ? ? ? ? # 如果是空鏈表,將_head指向node
? ? ? ? ? ? self.__head = node
? ? ? ? else:
? ? ? ? ? ? # 將node的next指向_head的頭節(jié)點
? ? ? ? ? ? node.next = self.__head
? ? ? ? ? ? # 將_head的頭節(jié)點的prev指向node
? ? ? ? ? ? self.__head.prev = node
? ? ? ? ? ? # 將_head 指向node
? ? ? ? ? ? self.__head = node
? ? def append(self, item):
? ? ? ? """尾部插入元素"""
? ? ? ? node = Node(item)
? ? ? ? if self.is_empty():
? ? ? ? ? ? # 如果是空鏈表,將_head指向node
? ? ? ? ? ? self.__head = node
? ? ? ? else:
? ? ? ? ? ? # 移動到鏈表尾部
? ? ? ? ? ? cur = self.__head
? ? ? ? ? ? while cur.next != None:
? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? # 將尾節(jié)點cur的next指向node
? ? ? ? ? ? cur.next = node
? ? ? ? ? ? # 將node的prev指向cur
? ? ? ? ? ? node.prev = cur
? ? def search(self, item):
? ? ? ? """查找元素是否存在"""
? ? ? ? cur = self.__head
? ? ? ? while cur != None:
? ? ? ? ? ? if cur.item == item:
? ? ? ? ? ? ? ? return True
? ? ? ? ? ? cur = cur.next
? ? ? ? return False
指定位置插入節(jié)點
def insert(self, pos, item):
? ? ? ? """在指定位置添加節(jié)點"""
? ? ? ? if pos <= 0:
? ? ? ? ? ? self.add(item)
? ? ? ? elif pos > (self.length()-1):
? ? ? ? ? ? self.append(item)
? ? ? ? else:
? ? ? ? ? ? node = Node(item)
? ? ? ? ? ? cur = self.__head
? ? ? ? ? ? count = 0
? ? ? ? ? ? # 移動到指定位置的前一個位置
? ? ? ? ? ? while count < (pos-1):
? ? ? ? ? ? ? ? count += 1
? ? ? ? ? ? ? ? cur = cur.next
? ? ? ? ? ? # 將node的prev指向cur
? ? ? ? ? ? node.prev = cur
? ? ? ? ? ? # 將node的next指向cur的下一個節(jié)點
? ? ? ? ? ? node.next = cur.next
? ? ? ? ? ? # 將cur的下一個節(jié)點的prev指向node
? ? ? ? ? ? cur.next.prev = node
? ? ? ? ? ? # 將cur的next指向node
? ? ? ? ? ? cur.next = node
刪除元素
def remove(self, item):
? ? ? ? """刪除元素"""
? ? ? ? cur = self.__head
? ? ? ? while cur != None:
? ? ? ? ? ? # 找到了要刪除的元素
? ? ? ? ? ? if cur.item == item:
? ? ? ? ? ? ? ? # 先判斷此結(jié)點是否是頭節(jié)點
? ? ? ? ? ? ? ? # 頭節(jié)點
? ? ? ? ? ? ? ? if cur == self.__head:
? ? ? ? ? ? ? ? ? ? self.__head = cur.next
? ? ? ? ? ? ? ? ? ? # 如果存在下一個結(jié)點,則設置下一個結(jié)點
? ? ? ? ? ? ? ? ? ? if cur.next:
? ? ? ? ? ? ? ? ? ? ? ? # 判斷鏈表是否只有一個結(jié)點
? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = None
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? cur.prev.next = cur.next
? ? ? ? ? ? ? ? ? ? # 如果存在下一個結(jié)點,則設置下一個結(jié)點
? ? ? ? ? ? ? ? ? ? if cur.next:
? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = cur.prev
? ? ? ? ? ? ? ? break
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? cur = cur.next
測試
if __name__ == "__main__":
? ? ll = DLinkList()
? ? ll.add(1)
? ? ll.add(2)
? ? ll.append(3)
? ? ll.insert(2, 4)
? ? ll.insert(4, 5)
? ? ll.insert(0, 6)
? ? print "length:",ll.length()
? ? ll.travel()
? ? print ll.search(3)
? ? print ll.search(4)
? ? ll.remove(1)
? ? print "length:",ll.length()
? ? ll.travel()
原文鏈接:https://blog.csdn.net/lislislislislis/article/details/88955448
相關推薦
- 2022-05-22 xampp安裝后Apache無法啟動解決辦法_Linux
- 2022-05-10 MAC m1使用homebrew安裝redis報錯
- 2022-08-16 React?中的?setState?是同步還是異步_React
- 2022-04-11 error: failed to push some refs to如何解決
- 2022-05-11 垃圾收集器ParNew&CMS與底層三色標記算法詳解
- 2022-09-27 golang?防緩存擊穿singleflight的實現(xiàn)_Golang
- 2022-03-18 Linux系統(tǒng)配置(服務控制)詳細介紹_Linux
- 2022-04-08 從頭學習C語言之指針和數(shù)組_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支