Python双向链表实现详解:从节点定义到完整操作
本文详细介绍Python中双向链表的实现方法,涵盖节点类与链表类的定义,以及判空、求长、遍历、增删查等核心操作的代码逻辑。通过完整实例解析,帮助开发者掌握双向链表的底层原理与具体应用。
Python双向链表实现概述
本文通过Python代码实例,详细解析双向链表的构建与使用方法,供读者参考学习。
双向链表结构解析
双向链表是一种将数据节点串联起来的数据结构。每个节点包含一个数据区和两个链接区,分别指向其前驱节点和后继节点。其中,数据区用于存储实际数据,而链接区则负责维护节点间的连接关系。
在节点结构中,prev字段用于指向并链接前一个节点,next字段用于指向并链接后一个节点。这种双向连接机制使得链表可以向前或向后遍历。
双向链表核心操作
双向链表的主要操作包括以下八项:
1. 判断链表是否为空;2. 获取链表的长度;3. 遍历链表中的所有元素;4. 在链表头部添加元素;5. 在链表尾部添加元素;6. 在指定位置插入元素;7. 删除指定节点;8. 查找指定节点是否存在。
代码实现与测试
以下是上述操作的具体代码实现部分。
# Functions 函数声明
class Node():
"""实例化节点类"""
def __init__(self, item):
self.item = item
self.prev = None
self.next = None
class Linklist():
"""
存储所有节点类
"""
def __init__(self):
"""
初始化一个头结点
默认为空
"""
self.head = None
# 1. 链表是否为空
def is_empty(self):
return self.head == None
# 2. 链表的长度
def length(self):
"""
返回节点的长度
实例化一个游标
使用这个游标遍历所有的数据
使用一个计数器,遍历一个数据,自增一,最后输出计数器
"""
# 实例化游标
cur = self.head
# 技术器
# 如果链表为空,不会进入循环,直接输出 0
count = 0
# 遍历所有的数据
while cur != None:
count +=1
cur = cur.next
return count
# 3. 遍历链表
def treval(self):
"""
遍历链表,获取所有的数据
使用游标,遍历整个链表,每次输出cur.item 的值
注意链表为空的情况,
"""
# 实例化一个游标
cur = self.head
# 遍历链表
while cur != None:
print(cur.item, end=' ')
cur = cur.next
print()
# 4. 链表头部添加元素
def add(self, item):
"""
头部添加数据
分析:
1、头部添加数据,链表为空时: self.head 指向node
2、链表不为空时: 先将node.next = self.head.next, 再讲 self.head = node
"""
# 实例化节点
node = Node(item)
# 添加数据
# 判断链表是否为空
if self.is_empty():
# 为空,直接将self.head 指向node
self.head=node
else:
# 不为空,先将noede
node.next = self.head
self.head.prev=node
self.head=node
# 5. 链表尾部添加元素
def append(self,item):
"""
尾部添加数据
分析:
要先将指针指向尾部的节点
最后的节点的 cur.next = node, node.prev = cur
"""
# 实例化节点
node = Node(item)
# 实例化游标
cur = self.head
# 移动游标到最后一个节点
# 如果链表为空
# 直接使用头插法
if self.is_empty():
self.add(item)
else:
while cur.next != None:
# cur.next 不为空,则进入循环, 上次循环,是进入上上个节点,但 将cur = cur.next,就指向了最后一个节点
cur = cur.next
node.prev = cur
cur.next = node
# 6. 链表指定位置添加元素
def insert(self, index, item):
"""
指定位置添加数据
分析
单链表中需要实例化两个有游标
双向链表,直接向指针指向索引的位置
将这个位置节点的 cur.
"""
# 实例化节点
node = Node(item)
# 实例化游标
cur = self.head
# 起始位置
count = 0
if index<=0:
# 使用头插法
self.add(item)
elif index > (self.length()-1):
self.append(item)
else:
# 移动游标
while count < index:
# 增加一
count += 1
# 移动游标到索引位置
cur = cur.next
node.next = cur
node.prev = cur.prev
cur.prev.next = node
cur.prev = node
# 7. 链表删除节点
def remove(self,item):
"""
删除指定的节点
首先实例化节点,遍历链表,找到该节点,删除该节点
"""
# 实例化游标
cur = self.head
# 遍历链表,找到该节点
while cur != None:
if cur.item == item:
if self.head == cur:
self.head = cur.next
if cur.next:
cur.next.prev = None
else:
cur.prev.next = cur.next
# 如果有下个节点,防止最后一个节点
if cur.next:
cur.next.prev = cur.prev
pass
break
else:
cur = cur.next
# # 8. 查找节点是否存在
def search(self, item):
"""
查看节点是否存在
分析
遍历链表,查看每一个节点的数据区
空链表
只有头节点
只有尾节点
"""
# 实例化一个游标
cur = self.head
# 遍历链表
while cur != None:
if cur.item == item:
return True
else:
cur = cur.next
return False通过测试运行验证代码逻辑,观察各操作的实际输出结果。
# 程序的入口
if __name__ == "__main__":
s = Linklist()
print(s.is_empty()) # True
s.append(100)
s.append(200)
s.append(300)
s.add(6)
s.insert(1, 10)
s.search(6)
s.treval() # 6 10 100 200 300
s.remove(100)
s.treval() # 6 10 200 300
pass以上内容为本文的全部介绍,希望能为读者的学习提供有益帮助,欢迎大家继续支持本站获取更多技术分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









