Python实现双链表
双向链表(Double_linked_list)也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
这里直接给出参考代码,大家有兴趣请自行探索,这里就不再详细介绍。
在/home/shiyanlou/
下新建一个文件double_linked_list.py
。
具体实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | class Node( object ): # 双向链表节点 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 get_length( self ): # 返回链表的长度 cur = self ._head count = 0 while cur ! = None : count = 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的头节点 node. next = self ._head # 将_head的头节点的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 # 将尾节点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 def insert( self , pos, item): # 在指定位置添加节点 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的下一个节点 node. next = cur. next # 将cur的下一个节点的prev指向node cur. next .prev = node # 将cur的next指向node cur. next = node def remove( self , item): # 删除元素 if self .is_empty(): return else : cur = self ._head if cur.item = = item: # 如果首节点的元素即是要删除的元素 if cur. next = = None : # 如果链表只有这一个节点 self ._head = None else : # 将第二个节点的prev设置为None cur. next .prev = None # 将_head指向第二个节点 self ._head = cur. next return while cur ! = None : if cur.item = = item: # 将cur的前一个节点的next指向cur的后一个节点 cur.prev. next = cur. next # 将cur的后一个节点的prev指向cur的前一个节点 cur. next .prev = cur.prev break cur = cur. next |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现