成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python數據結構之雙鏈表

開發 后端
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。

[[411390]]

本文轉載自微信公眾號「python與大數據分析」,作者一只小小鳥鳥。轉載本文請聯系python與大數據分析公眾號。

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。

雙鏈表和單鏈表在查找和遍歷上沒什么區別,在新增節點、添加節點、刪除節點上需要注意前后節點的修改,比單鏈表會復雜一些,一不小心就繞暈了。

方法和單鏈表是一致的。

isempty(self) 鏈表是否為空

length(self) 鏈表長度

travel(self) 遍歷整個鏈表

add(self,item) 鏈表頭部添加元素

append(self,item) 鏈表尾部添加元素

insert(self,item,index) 指定位置添加元素

deletebyitem(self,item) 根據數據項刪除節點

deletebyindex(self,index) 根據索引位置刪除節點

search(self,item) 根據數據項查找節點是否存在

update(self,index,item) 暫無實現

getitem(self,index) 獲取索引位置對應的數據項

getindex(self,item) 獲取數據項對應的索引位置

如下:

  1. #!/usr/bin/env python 
  2. # -*- coding: UTF-8 -*- 
  3. #                     _ooOoo_ 
  4. #                   o8888888o 
  5. #                    88" . "88 
  6. #                 ( | -  _  - | ) 
  7. #                     O\ = /O 
  8. #                 ____/`---'\____ 
  9. #                  .' \\| |// `. 
  10. #                 / \\|||:|||// \ 
  11. #               / _|||||-:- |||||- \ 
  12. #                | | \\\ - /// | | 
  13. #              | \_| ''\---/'' | _/ | 
  14. #               \ .-\__ `-` ___/-. / 
  15. #            ___`. .' /--.--\ `. . __ 
  16. #         ."" '< `.___\_<|>_/___.' >'""
  17. #       | | : `- \`.;`\  _ /`;.`/ - ` : | | 
  18. #          \ \ `-. \_ __\ /__ _/ .-` / / 
  19. #      ==`-.____`-.___\_____/___.-`____.-'== 
  20. #                     `=---=' 
  21. ''
  22. @Project :pythonalgorithms  
  23. @File :doublelinklist.py 
  24. @Author :不勝人生一場醉 
  25. @Date :2021/7/13 23:00  
  26. ''
  27.  
  28.  
  29. class Node(object): 
  30.     def __init__(self, data): 
  31.         self.prev = None 
  32.         self.data = data 
  33.         self.next = None 
  34.  
  35.  
  36. class DoubleLinkList(object): 
  37.     def __init__(self): 
  38.         self.header = None 
  39.         self.currentnum = 0 
  40.  
  41.     def isempty(self): 
  42.         return self.header == None 
  43.  
  44.     def travel(self): 
  45.         tempnode = self.header 
  46.         while tempnode != None: 
  47.             print("{}".format(tempnode.data), end=" "
  48.             tempnode = tempnode.next 
  49.         print("\r"
  50.  
  51.     def add(self, item): 
  52.         node = Node(item) 
  53.         if self.isempty(): 
  54.             self.header = node 
  55.             self.currentnum += 1 
  56.             return 
  57.         node.next = self.header 
  58.         self.header.prev = node 
  59.         self.header = node 
  60.         self.currentnum += 1 
  61.  
  62.     def append(self, item): 
  63.         if self.isempty(): 
  64.             self.add(item) 
  65.             self.currentnum += 1 
  66.             return 
  67.         tempnode = self.header 
  68.         while tempnode.next is not None: 
  69.             tempnode = tempnode.next 
  70.         node = Node(item) 
  71.         node.prev = tempnode 
  72.         tempnode.next = node 
  73.         self.currentnum += 1 
  74.  
  75.     def length(self): 
  76.         length = 0 
  77.         tempnode = self.header 
  78.         while tempnode is not None: 
  79.             length += 1 
  80.             tempnode = tempnode.next 
  81.         return length 
  82.  
  83.     def search(self, item): 
  84.         tempnode = self.header 
  85.         while tempnode != None: 
  86.             if tempnode.data == item: 
  87.                 return True 
  88.             else
  89.                 tempnode = tempnode.next 
  90.         return False 
  91.  
  92.     def update(self, index, item): 
  93.         pass 
  94.  
  95.     def getitem(self, index): 
  96.         if index > self.currentnum or index <= 0: 
  97.             raise IndexError("{} is not find in Linklist".format(index)) 
  98.         tempnode = self.header 
  99.         i = 1 
  100.         while i < index
  101.             tempnode = tempnode.next 
  102.             i += 1 
  103.         if tempnode.next == None: 
  104.             return -1 
  105.         else
  106.             return tempnode.data 
  107.  
  108.     def getindex(self, item): 
  109.  
  110.         tempnode = self.header 
  111.         i = 0 
  112.         flag = False 
  113.         while tempnode != None: 
  114.             i += 1 
  115.             if tempnode.data == item: 
  116.                 flag = True 
  117.                 return i 
  118.             else
  119.                 tempnode = tempnode.next 
  120.         if flag == False
  121.             return 0 
  122.  
  123.     def insert(self, item, index): 
  124.         tempnode = self.header 
  125.         if index > self.currentnum + 1 or index <= 0: 
  126.             raise IndexError("{} is not find in Linklist".format(index)) 
  127.         # 指定位置為第一個即在頭部插入 
  128.  
  129.         if index == 1: 
  130.             self.add(item) 
  131.         elif index > self.currentnum - 1: 
  132.             self.append(item) 
  133.         else
  134.             node = Node(item) 
  135.             for i in range(1, index - 1): 
  136.                 tempnode = tempnode.next 
  137.             node.next = tempnode.next 
  138.             node.prev = tempnode 
  139.             tempnode.next.prev = node 
  140.             tempnode.next = node 
  141.         self.currentnum += 1 
  142.  
  143.     def deletebyitem(self, item): 
  144.         tempnode = self.header 
  145.         while tempnode != None: 
  146.             if tempnode.data == item: 
  147.                 self.currentnum -= 1 
  148.                 if tempnode == self.header: 
  149.                     self.header = self.header.next 
  150.                     if tempnode.next
  151.                         tempnode.next.prev = None 
  152.                     return 
  153.                 if tempnode.next is None: 
  154.                     tempnode.prev.next = tempnode.next 
  155.                     return 
  156.                 tempnode.prev.next = tempnode.next 
  157.                 tempnode.next.prev = tempnode.prev 
  158.                 return 
  159.             tempnode = tempnode.next 
  160.  
  161.     def deletebyindex(self, index): 
  162.  
  163.         if index > self.currentnum or index <= 0: 
  164.             raise IndexError("{} is not find in Linklist".format(index)) 
  165.  
  166.         i = 1 
  167.         tempnode = self.header 
  168.  
  169.         if index == 1: 
  170.             self.header = tempnode.next 
  171.             if tempnode.next
  172.                 tempnode.prev = None 
  173.             self.currentnum -= 1 
  174.             return 
  175.  
  176.         while tempnode.next and i < index
  177.             tempnode = tempnode.next 
  178.             i += 1 
  179.         if tempnode.next is None: 
  180.             tempnode.prev.next = tempnode.next 
  181.             self.currentnum -= 1 
  182.             return 
  183.         if i == index
  184.             tempnode.prev.next = tempnode.next 
  185.             tempnode.next.prev = tempnode.prev 
  186.             self.currentnum -= 1 
  187.  
  188.  
  189. if __name__ == '__main__'
  190.     a = DoubleLinkList() 
  191.     a.add(1)  # 1 
  192.     a.travel() 
  193.     a.add(2) 
  194.     a.travel() 
  195.     a.append(4) 
  196.     a.travel() 
  197.     a.append(3) 
  198.     a.travel() 
  199.     print(a.length()) 
  200.     print(a.search(1)) 
  201.     print(a.getindex(4)) 
  202.     print(a.getindex(5)) 
  203.     print(a.getitem(2)) 
  204.     # print(a.getitem(5)) 
  205.     # IndexError: 5 is not find in Linklist 
  206.     a.insert(5, 1) 
  207.     a.travel() 
  208.     a.insert(6, 5) 
  209.     a.travel() 
  210.     a.insert(7, 2) 
  211.     a.travel() 
  212.     a.deletebyitem(7) 
  213.     a.travel() 
  214.     a.deletebyitem(6) 
  215.     a.travel() 
  216.     a.deletebyitem(5) 
  217.     a.travel() 
  218.     a.deletebyindex(2) 
  219.     a.travel() 
  220.     a.deletebyindex(3) 
  221.     a.travel() 
  222.     a.deletebyindex(1) 
  223.     a.travel() 

調試了2、3個小時的bug,才跑通。

運行如下:

  1. C:\python\pyproject\pythonalgorithms\venv\Scripts\python.exe C:/python/pyproject/pythonalgorithms/doublelinklist.py 
  2. 1  
  3. 2 1  
  4. 2 1 4  
  5. 2 1 4 3  
  6. True 
  7. 5 2 1 4 3  
  8. 5 2 1 4 6 3  
  9. 5 7 2 1 4 6 3  
  10. 5 2 1 4 6 3  
  11. 5 2 1 4 3  
  12. 2 1 4 3  
  13. 2 4 3  
  14. 2 4  
  15. 4  
  16.  
  17. Process finished with exit code 0 

 

鏈表頭部增加節點示意圖

 

責任編輯:武曉燕 來源: python與大數據分析
相關推薦

2021-07-13 07:52:03

Python數據結構

2017-03-01 13:58:46

Python數據結構鏈表

2012-02-02 10:21:05

單鏈表nexthead

2021-08-03 10:24:59

數據跳躍鏈表結構

2021-05-12 14:09:35

鏈表數據結構線性結構

2021-04-12 15:47:00

數據結構算法鏈表

2021-07-16 07:57:34

Python數據結構

2021-12-21 08:19:29

數據結構算法鏈表相交

2021-10-29 11:27:52

鏈表數據結構算法

2021-01-06 08:03:00

JavaScript數據結構

2021-07-11 12:06:43

python數據結構

2021-01-28 07:33:34

JavaScript鏈表數據

2023-03-28 07:44:23

數據結構數組

2021-03-10 08:42:19

Java數據結構算法

2023-10-06 20:21:28

Python鏈表

2009-07-02 14:59:28

Java考研試題

2021-09-12 17:31:17

Python數據結構

2018-06-06 08:54:23

數據結構存儲

2024-10-11 16:43:05

高并發數據結構技巧

2022-01-18 19:13:52

背包問題數據結構算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线第二页 | 91婷婷韩国欧美一区二区 | 久久这里只有精品首页 | 综合九九| 日韩中文字幕在线视频观看 | 国内自拍偷拍 | 亚洲精品高清视频在线观看 | 国产一区二区三区免费 | 久久午夜视频 | 国产精品久久久久久久粉嫩 | 成人精品啪啪欧美成 | 欧美男人天堂 | 成人在线一级片 | 成人a视频在线观看 | 日本天天操 | 中文字幕在线观看第一页 | www.v888av.com | 91精品国产综合久久久久久漫画 | 亚洲一区二区三区免费在线 | 免费成年网站 | 伊人免费观看视频 | 成人二区| 久久久久久久国产精品 | 日本在线免费看最新的电影 | 成人美女免费网站视频 | 欧美电影免费观看高清 | 日韩国产一区二区三区 | 国产一级在线视频 | 久久国产精品免费视频 | 国产乱码精品一区二区三区忘忧草 | 国产成人精品免费 | 精品熟人一区二区三区四区 | 久久日韩粉嫩一区二区三区 | 中文久久 | 国产精品自拍视频 | 颜色网站在线观看 | 国产在线网站 | 国产九九九九 | 免费观看av| 99精品免费视频 | 欧美日韩在线免费观看 |