文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python数据结构之单链表

2024-12-03 01:44

关注

本文转载自微信公众号「python与大数据分析」,作者一只小小鸟鸟。转载本文请联系python与大数据分析公众号。

今天终于把大学都没想明白的链表数据结构整明白了,也算小小的收获,挺好玩的。文后附链表操作示意图。

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

链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

代码基本为原创,经过大量重写

  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与大数据分析内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯