# *-* coding:utf8 *-*
class Node(object):
"""抽象出节点类"""
def __init__(self, obj):
self.pre = None # 指向上一个节点,初始为None
self.data = obj # 指向
self.next = None
class DoubleLinkList(object):
"""双向链表(双链表)"""
def __init__(self, head_node=None):
"""对于链表而言,只需要保存其一个节点即可,这里还是保存头节点"""
self.__head = head_node
def is_empty(self):
"""判断链表是否是空链表"""
return self.__head is None
def length(self):
"""判断链表的长度"""
cur = self.__head
count = 0
while cur is not None:
cur = cur.next
count += 1
return count
def travel(self):
"""双向链表的遍历操作"""
cur = self.__head
while cur is not None:
print(cur.data, end=" ")
cur = cur.next
print()
def add(self, obj):
"""链表头插法"""
# 构建 新节点
node = Node(obj)
if self.is_empty():
self.__head = node
else:
node.next = self.__head
self.__head.pre = node
self.__head = node
def append(self, obj):
"""双向链表 尾插法"""
node = Node(obj)
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur.next is not None:
cur = cur.next
cur.next = node
node.pre = cur
def insert(self, index, obj):
"""双向链表的插入操作"""
assert isinstance(index, int)
if index <= 0:
self.add(obj)
elif index >= self.length():
self.append(obj)
else:
node = Node(obj)
cur = self.__head
for i in range(index):
cur = cur.next
cur.pre.next = node
node.pre = cur.pre
cur.pre = node
node.next = cur
def remove(self, obj):
"""移除双向链表中的元素"""
if self.is_empty():
return
cur = self.__head
while cur is not None:
if cur.data == obj:
# 找到了要删除的节点
if self.length() == 1:
# 只有一个节点
self.__head = None
if cur.pre is not None and cur.next is not None:
cur.pre.next = cur.next
cur.next.pre = cur.pre # 可能不存在 pre 尾节点
# 要将这个节点回收
del cur
elif cur.pre is not None:
# 表示要删除的是尾节点
cur.pre.next = None
del cur
elif cur.pre is None:
self.__head = cur.next
cur.next.pre = None
del cur
# 如果找到了, 退出循环
break
cur = cur.next
def search(self, obj):
"""查找某个节点是否存在"""
cur = self.__head
while cur is not None:
if cur.data == obj:
return True
cur = cur.next
# 默认不存在
return False
def reverse(self):
"""双链表反转"""
cur = self.__head
# 如果cur 是空链表,不做任何处理;
if not cur:
return
cur.pre = cur.next
cur.next = None
while cur.pre is not None:
# 先处理pre,再处理next
cur.pre.pre = cur.pre.next
cur.pre.next = cur
cur = cur.pre
self.__head = cur
return self
if __name__ == '__main__':
dll = DoubleLinkList()
print(dll.is_empty())
print(dll.length())
dll.add(100)
print(dll.is_empty())
print(dll.length())
dll.travel()
dll.add(200)
print(dll.is_empty())
print(dll.length())
dll.travel()
dll.append("zhangsan")
print(dll.length())
dll.travel()
dll.append("lisi")
print(dll.length())
dll.travel()
dll.insert(-5, "he")
dll.travel()
dll.insert(1, "her")
dll.travel()
dll.insert(10, "she")
dll.travel()
dll.remove("zhangsan")
dll.travel()
dll.remove("he")
dll.remove("she")
dll.remove("her")
dll.travel()
# dll.remove(10000)
print(dll.search("lisi")) # True
print(dll.search(10000)) # False
# 双向链表反转
temp = dll.reverse()
temp.travel()
python实现双链表 判空 长度 遍历 头插 尾插 插入 删除 范围查询 反转
最新推荐文章于 2024-07-09 18:57:50 发布
本文详细介绍了一种数据结构——双向链表的实现方法,并提供了包括插入、删除、搜索及反转等基本操作的具体代码实现。通过实例展示了双向链表的初始化、节点添加、遍历等功能。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
Python3.8
Conda
Python
Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本
799

被折叠的 条评论
为什么被折叠?



