Python数据结构之单链表

开发 后端
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。

[[410894]]

本文转载自微信公众号「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. class Node(object): 
  2.     def __init__(self, item): 
  3.         self.item = item 
  4.         self.next = None 
  5.     def __repr__(self): 
  6.         pass 
  7.     def __str__(self): 
  8.         return str(self.item) 
  9.  
  10. class SingleLinkList(object): 
  11.     def __init__(self): 
  12.         self.header = None 
  13.         self.currentnum=0 
  14.  
  15.     def isempty(self): 
  16.         return self.header == None 
  17.  
  18.     def length(self): 
  19.         return self.currentnum 
  20.  
  21.     def travel(self): 
  22.         cur =self.header 
  23.         while cur !=None: 
  24.             print("{}".format(cur.item),end=" "
  25.             cur=cur.next 
  26.         print("\r"
  27.  
  28.     def add(self,item): 
  29.         node=Node(item) 
  30.         # 新节点的链接指向头节点 
  31.         node.next=self.header 
  32.         # 链表的头指向新节点 
  33.         self.header=node 
  34.         self.currentnum+=1 
  35.  
  36.     def append(self,item): 
  37.         tempnode=self.header 
  38.         node=Node(item) 
  39.         if self.isempty(): 
  40.             self.add(node) 
  41.         else
  42.             while tempnode.next!=None: 
  43.                 tempnode=tempnode.next 
  44.             tempnode.next=node 
  45.             self.currentnum+=1 
  46.  
  47.     def insert(self,item,index): 
  48.         node=Node(item) 
  49.         tempnode=self.header 
  50.         if index>self.currentnum+1 or index<=0: 
  51.             raise IndexError("{} is not find in Linklist".format(index)) 
  52.         # 指定位置为第一个即在头部插入 
  53.         if index==1: 
  54.             self.add(node) 
  55.         elif index>self.currentnum-1: 
  56.             self.append(node) 
  57.         else
  58.             for i in range(1,index-1): 
  59.                 tempnode=tempnode.next 
  60.             node.next=tempnode.next 
  61.             tempnode.next=node 
  62.             self.currentnum+=1 
  63.  
  64.     def deletebyitem(self,item): 
  65.         tempnode=self.header 
  66.         prenode=None 
  67.         while tempnode!=None: 
  68.             if tempnode.item==item: 
  69.                 if tempnode==self.header: 
  70.                     self.header=tempnode.next 
  71.                 else
  72.                     prenode.next=tempnode.next 
  73.                 break 
  74.             else
  75.                 prenode=tempnode 
  76.                 tempnode=tempnode.next 
  77.  
  78.  
  79.     def deletebyindex(self,index): 
  80.  
  81.         if index>self.currentnum or index<=0: 
  82.             raise IndexError("{} is not find in Linklist".format(index)) 
  83.  
  84.         i=1 
  85.         tempnode=self.header 
  86.         prenode=self.header 
  87.  
  88.         if index==1: 
  89.             self.header = tempnode.next 
  90.             self.currentnum-=1 
  91.             return 
  92.  
  93.         while tempnode.next and i<index
  94.             prenode = tempnode 
  95.             tempnode = tempnode.next 
  96.             i+=1 
  97.  
  98.         if i==index
  99.             prenode.next=tempnode.next 
  100.             self.currentnum-=1 
  101.  
  102.  
  103.     def search(self,item): 
  104.         tempnode=self.header 
  105.         while tempnode!=None: 
  106.             if tempnode.item==item: 
  107.                 return True 
  108.             else
  109.                 tempnode=tempnode.next 
  110.         return False 
  111.  
  112.     def update(self,index,item): 
  113.         pass 
  114.  
  115.     def getitem(self,index): 
  116.         if index<=0 or index>self.currentnum: 
  117.             raise IndexError("{} is not find in Linklist".format(index)) 
  118.         tempnode=self.header 
  119.         i=1 
  120.         while i<index
  121.             tempnode=tempnode.next 
  122.             i+=1 
  123.         return tempnode.item 
  124.  
  125.     def getindex(self,item): 
  126.         tempnode = self.header 
  127.         i=0 
  128.         flag=False 
  129.         while tempnode != None: 
  130.             i+=1 
  131.             if tempnode.item == item: 
  132.                 flag=True 
  133.                 return i 
  134.             else
  135.                 tempnode = tempnode.next 
  136.         if flag==False
  137.             return 0 
  138.  
  139. if __name__ == '__main__'
  140.     a = SingleLinkList() 
  141.     a.add(1)  # 1 
  142.     print('a.add(1)'
  143.     a.travel() 
  144.     a.add(2)  # 2 1 
  145.     print('a.add(2)'
  146.     a.travel() 
  147.     a.append(3)  # 2 1 3 
  148.     print('a.append(3)'
  149.     a.travel() 
  150.     a.insert(4, 2)  # 2 1 4 3 
  151.     print('a.insert(2, 4)'
  152.     a.travel() 
  153.     print('a.search(1)=',a.search(1)) 
  154.     print('a.search(5)=', a.search(5)) 
  155.     print('a.getindex(1)=',a.getindex(1)) 
  156.     print('a.getindex(5)=', a.getindex(5)) 
  157.     print('a.getitem(2)=', a.getitem(2)) 
  158.     print('a.getitem(4)=', a.getitem(4)) 
  159.     print('a.getitem(3)=', a.getitem(3)) 
  160.     # a.deletebyitem(5) 
  161.     # print('a.deletebyitem(5)'
  162.     # a.travel() 
  163.     # a.deletebyitem(4) 
  164.     # print('a.deletebyitem(4)'
  165.     # a.travel() 
  166.     # a.deletebyitem(2) 
  167.     # print('a.deletebyitem(2)'
  168.     # a.travel() 
  169.     a.deletebyindex(4) 
  170.     print('a.deletebyindex(4)'
  171.     a.travel() 
  172.     a.deletebyindex(2) 
  173.     print('a.deletebyindex(2)'
  174.     a.travel() 
  175.     a.deletebyindex(1) 
  176.     print('a.deletebyindex(1)'
  177.     a.travel() 

结果如下

  1. C:\python\pyproject\pythonalgorithms\venv\Scripts\python.exe C:/python/pyproject/pythonalgorithms/linklist.py 
  2. a.add(1) 
  3. 1  
  4. a.add(2) 
  5. 2 1  
  6. a.append(3) 
  7. 2 1 3  
  8. a.insert(2, 4) 
  9. 2 4 1 3  
  10. a.search(1)= True 
  11. a.search(5)= False 
  12. a.getindex(1)= 3 
  13. a.getindex(5)= 0 
  14. a.getitem(2)= 4 
  15. a.getitem(4)= 3 
  16. a.getitem(3)= 1 
  17. a.deletebyindex(4) 
  18. 2 4 1  
  19. a.deletebyindex(2) 
  20. 2 1  
  21. a.deletebyindex(1) 
  22. 1  
  23.  
  24. Process finished with exit code 0 

链表头部增加节点示意图

从链表尾部增加节点示意图

 

责任编辑:武晓燕 来源: python与大数据分析
相关推荐

2012-02-02 10:21:05

单链表nexthead

2017-03-01 13:58:46

Python数据结构链表

2021-07-15 06:43:12

Python数据结构

2021-03-10 08:42:19

Java数据结构算法

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数据结构

2020-10-28 10:10:03

Java单链表数据结构

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-10-06 20:21:28

Python链表

2023-03-28 07:44:23

数据结构数组

2009-07-02 14:59:28

Java考研试题

2023-09-21 16:13:20

Python数据结构

2018-06-06 08:54:23

数据结构存储

2023-10-31 08:51:25

数据结构存储数据
点赞
收藏

51CTO技术栈公众号