"""
链表是一种无序的列表,每个元素是Node结点,每个Node会保存结点值value和下一个节点的引用next
"""
class Node:
"""
定义结点对象
"""
def __init__(self, data):
self.data = data # 当前结点的值
self.next = None # 下一个节点的引用
# 获取node里面的数据
def get_data(self):
return self.data
# 获取下一个结点的引用
def get_next(self):
return self.next
# 设置node里面的数据
def set_data(self, new_data):
self.data = new_data
# 设置下一个结点的引用
def set_next(self, new_next):
self.next = new_next
class SingleLinkList:
"""
定义链表, 定义一个head属性, 链表头.
链表本身是不包含任何结点Node的, 只包含链式结构中对第一个结点的引用
链表和结点在定义上是独立的, 互相不包含对方.
"""
def __init__(self):
self.head = None # head为None表示空链表
# 判断链表是否为空
def is_empty(self):
return self.head is None
# 获取链表的长度
def get_size(self):
current_node = self.head # 从表头开始对结点计数
size = 0
while current_node is not None: # 结点的next指向None,遍历完成
size += 1
current_node = current_node.get_next()
return size
# 向链表中增加一个结点
# 链表结构始终只保持对第一个结点的引用, 故增加结点最简单的方法是将增加的新结点作为表头
def add_node(self, val):
temp = Node(val)
temp.next = self.head # 将要增加结点的下一个节点指向原来的表头
self.head = temp # 将新表头设置为增加的结点
# 查找指定结点是否在结点中
# 遍历链表, 设置一个布尔值作为是否查找到目标元素的标志
def search_node(self, item):
current_node = self.head # 从头结点开始遍历
is_found = False # 是否找到标志
while current_node is not None and not is_found: # 链表没遍历完,而且还没找到
if current_node.get_data() == item:
is_found = True
else:
current_node = current_node.get_next()
return is_found
# 移除指定结点
def remove_node(self, item):
current_node = self.head # 当前结点,头结点
previous_node = None # 当前结点的上一个结点
is_found = False # 是否存在的标志
# 如果结点不在链表中,直接return
if not self.search_node(item):
return
# 如果结点在链表中, 停止遍历
while not is_found:
if current_node.get_data() == item:
is_found = True
else:
previous_node = current_node
current_node = current_node.get_next()
# 被删除的结点是表头时
if previous_node is None:
self.head = current_node.get_next()
else:
previous_node.set_next(current_node.get_next())
# 获取所有结点的值
def get_all_nodes(self):
all_nodes = [] # 存放所有结点的列表
current_node = self.head # 从表头开始循环遍历链表
while current_node is not None:
all_nodes.append(current_node.get_data())
current_node = current_node.get_next()
return all_nodes
if __name__ == '__main__':
singleLinkList = SingleLinkList()
for i in range(10, 50, 5):
singleLinkList.add_node(i)
print(singleLinkList.get_all_nodes()) # [45, 40, 35, 30, 25, 20, 15, 10]
print(singleLinkList.get_size()) # 8
singleLinkList.remove_node(35)
print(singleLinkList.get_all_nodes()) # [45, 40, 30, 25, 20, 15, 10]
print(singleLinkList.search_node(20)) # True
print(singleLinkList.search_node(22)) # False
print(singleLinkList.is_empty()) # False
singleLinkList.add_node(86)
print(singleLinkList.get_all_nodes()) # [86, 45, 40, 30, 25, 20, 15, 10]
python---链表的常用操作
猜你喜欢
转载自www.cnblogs.com/KX-Lau/p/12464854.html
今日推荐
周排行