本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Python数据结构之双链表
sz199511 · 163浏览 · 发布于2021-07-15 +关注

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

双链表和单链表在查找和遍历上没什么区别,在新增节点、添加节点、删除节点上需要注意前后节点的修改,比单链表会复杂一些,一不小心就绕晕了。

方法和单链表是一致的。

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. class Node(object): 

  28.     def __init__(self, data): 

  29.         self.prev = None 

  30.         self.data = data 

  31.         self.next = None 

  32. class DoubleLinkList(object): 

  33.     def __init__(self): 

  34.         self.header = None 

  35.         self.currentnum = 0 

  36.    def isempty(self): 

  37.         return self.header == None 

  38.     def travel(self): 

  39.         tempnode = self.header 

  40.         while tempnode != None: 

  41.             print("{}".format(tempnode.data), end=" ") 

  42.             tempnode = tempnode.next 

  43.         print("\r") 

  44.     def add(self, item): 

  45.         node = Node(item) 

  46.         if self.isempty(): 

  47.             self.header = node 

  48.             self.currentnum += 1 

  49.             return 

  50.         node.next = self.header 

  51.         self.header.prev = node 

  52.         self.header = node 

  53.         self.currentnum += 1 

  54.     def append(self, item): 

  55.         if self.isempty(): 

  56.             self.add(item) 

  57.             self.currentnum += 1 

  58.             return 

  59.         tempnode = self.header 

  60.         while tempnode.next is not None: 

  61.             tempnode = tempnode.next 

  62.         node = Node(item) 

  63.         node.prev = tempnode 

  64.         tempnode.next = node 

  65.         self.currentnum += 1 

  66.     def length(self): 

  67.         length = 0 

  68.         tempnode = self.header 

  69.         while tempnode is not None: 

  70.             length += 1 

  71.             tempnode = tempnode.next 

  72.         return length 

  73.     def search(self, item): 

  74.         tempnode = self.header 

  75.         while tempnode != None: 

  76.             if tempnode.data == item: 

  77.                 return True 

  78.             else: 

  79.                 tempnode = tempnode.next 

  80.         return False 

  81.     def update(self, index, item): 

  82.         pass 

  83.     def getitem(self, index): 

  84.         if index > self.currentnum or index <= 0: 

  85.             raise IndexError("{} is not find in Linklist".format(index)) 

  86.         tempnode = self.header 

  87.         i = 1 

  88.         while i < index: 

  89.            tempnode = tempnode.next 

  90.            i += 1 

  91.         if tempnode.next == None: 

  92.             return -1 

  93.         else: 

  94.             return tempnode.data 

  95.     def getindex(self, item): 

  96.         tempnode = self.header 

  97.         i = 0 

  98.         flag = False 

  99.         while tempnode != None: 

  100.             i += 1 

  101.             if tempnode.data == item: 

  102.                 flag = True 

  103.                 return i 

  104.             else: 

  105.                 tempnode = tempnode.next 

  106.         if flag == False: 

  107.             return 0 

  108.     def insert(self, item, index): 

  109.         tempnode = self.header 

  110.         if index > self.currentnum + 1 or index <= 0: 

  111.             raise IndexError("{} is not find in Linklist".format(index)) 

  112.         # 指定位置为第一个即在头部插入 

  113.         if index == 1: 

  114.             self.add(item) 

  115.         elif index > self.currentnum - 1: 

  116.             self.append(item) 

  117.         else: 

  118.             node = Node(item) 

  119.             for i in range(1, index - 1): 

  120.                 tempnode = tempnode.next 

  121.            node.next = tempnode.next 

  122.             node.prev = tempnode 

  123.             tempnode.next.prev = node 

  124.             tempnode.next = node 

  125.         self.currentnum += 1 

  126.     def deletebyitem(self, item): 

  127.         tempnode = self.header 

  128.         while tempnode != None: 

  129.             if tempnode.data == item: 

  130.                 self.currentnum -= 1 

  131.                 if tempnode == self.header: 

  132.                     self.header = self.header.next 

  133.                     if tempnode.next: 

  134.                         tempnode.next.prev = None 

  135.                     return 

  136.                 if tempnode.next is None: 

  137.                     tempnode.prev.next = tempnode.next 

  138.                     return 

  139.                 tempnode.prev.next = tempnode.next 

  140.                 tempnode.next.prev = tempnode.prev 

  141.                 return 

  142.             tempnode = tempnode.next 

  143.     def deletebyindex(self, index): 

  144.         if index > self.currentnum or index <= 0: 

  145.             raise IndexError("{} is not find in Linklist".format(index)) 

  146.         i = 1 

  147.         tempnode = self.header 

  148.         if index == 1: 

  149.             self.header = tempnode.next 

  150.             if tempnode.next: 

  151.                 tempnode.prev = None 

  152.             self.currentnum -= 1 

  153.             return 

  154.         while tempnode.next and i < index: 

  155.             tempnode = tempnode.next 

  156.             i += 1 

  157.         if tempnode.next is None: 

  158.             tempnode.prev.next = tempnode.next 

  159.             self.currentnum -= 1 

  160.             return 

  161.         if i == index: 

  162.             tempnode.prev.next = tempnode.next 

  163.             tempnode.next.prev = tempnode.prev 

  164.             self.currentnum -= 1 

  165. if __name__ == '__main__': 

  166.     a = DoubleLinkList() 

  167.     a.add(1)  # 1 

  168.     a.travel() 

  169.     a.add(2) 

  170.     a.travel() 

  171.     a.append(4) 

  172.     a.travel() 

  173.     a.append(3) 

  174.     a.travel() 

  175.     print(a.length()) 

  176.     print(a.search(1)) 

  177.     print(a.getindex(4)) 

  178.     print(a.getindex(5)) 

  179.     print(a.getitem(2)) 

  180.     # print(a.getitem(5)) 

  181.     # IndexError: 5 is not find in Linklist 

  182.     a.insert(5, 1) 

  183.     a.travel() 

  184.     a.insert(6, 5) 

  185.     a.travel() 

  186.     a.insert(7, 2) 

  187.     a.travel() 

  188.     a.deletebyitem(7) 

  189.     a.travel() 

  190.     a.deletebyitem(6) 

  191.     a.travel() 

  192.     a.deletebyitem(5) 

  193.     a.travel() 

  194.     a.deletebyindex(2) 

  195.     a.travel() 

  196.     a.deletebyindex(3) 

  197.     a.travel() 

  198.     a.deletebyindex(1) 

  199.     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. Process finished with exit code 0 

链表头部增加节点示意图


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1325浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 908浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 970浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 962浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1086浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
不积跬步无以至千里,不积小流无以成江海!
分类专栏
小鸟云服务器
扫码进入手机网页