# 普通节点
from faulthandler import is_enabled
class Node:
def __init__(self, data):
self.data = data
self.next = None
# 头节点
class LinkList:
def __init__(self, node= None):
self.size = 0
self.head = node
def is_empty(self):
return self.size == 0
def show(self):
if self.is_empty():
print("空线性表,无需遍历")
return False
q = self.head
while q:
print(q.data,end=' ')
q = q.next
print()
def add_head(self, value):
node = Node(value)
node.next = self.head
self.head = node
self.size += 1
def add_end(self,value):
node = Node(value)
if self.is_empty():
self.head = node
self.size += 1
return True
q = self.head
while q.next:
q = q.next
q.next = node
self.size += 1
def add_any(self, index, value):
if index<=0 or index-1>self.size:
print("超出索引,插入失败")
return False
node = Node(value)
if index == 1:
self.add_head(value)
return True
p = self.head
p_num = 1
while p_num < index-1:
p = p.next
p_num += 1
node.next = p.next
p.next = node
self.size += 1
return True
# def del_data(self,value):
# if self.is_empty():
# print("空线性表,无需删除")
# return False
#
# p_up = self.head
# p_new = self.head
# while
def del_head(self):
if self.is_empty():
print("空线性表,不需要删除")
return False
self.head = self.head.next
self.size -= 1
def del_end(self):
if self.is_empty():
print("空线性表,不需要删除")
return False
if self.size == 1:
self.del_head()
return False
p = self.head
while p.next.next:
p = p.next
p.next = None
self.size -= 1
def del_any(self, index):
if self.is_empty() or index <=0 or index > self.size:
print("超出索引,无法删除")
return False
if index == 1:
self.del_head()
return False
p = self.head
p_num = 1
while p_num < index-1:
p = p.next
p_num += 1
p.next = p.next.next
self.size -= 1
def re_index(self, index, value):
if self.is_empty():
print("空链表,无法修改")
return False
if index > self.size or index <0:
print("超出索引,修改错误")
p = self.head
i = 1
while i < index:
p = p.next
i += 1
p.data = value
def re_value(self,value_old, value_new):
if self.is_empty():
print("空链表,无法修改")
return False
p = self.head
while p:
if p.data == value_old:
p.data = value_new
p = p.next
def value_index(self, value):
if self.is_empty():
print("空链表,无法查找")
return False
p = self.head
p_index = 1
while p:
if p.data == value:
return p_index
p = p.next
p_index += 1
def reverse(self):
if self.is_empty():
print("空链表,无法查找")
return False
# 反转值
# p = self.head
# n = self.size
# while p:
# self.add_head(p.data)
# p = p.next
# while n:
# self.del_end()
# n -= 1
# 反转指针
p = None
q = self.head
while q:
next_node = q.next # 暂存下一个节点
q.next = p # 当前节点指向前一个节点
p = q # 更新 prev 为当前节点
q = next_node # 移动到下一个节点
self.head = p # 返回新的头节点
if __name__ == '__main__':
T = LinkList()
# 头插
T.add_head(10)
T.add_head(20)
T.add_head(30)
T.show()
# 头删
T.del_head()
T.del_head()
T.del_head()
T.show()
# 尾插
T.add_end(10)
T.add_end(20)
T.show()
# 尾删
T.del_end()
T.del_end()
T.show()
# 任意插
T.add_any(1, 40)
T.show()
# 任意删
T.del_any(1)
T.show()
T.add_head(10)
T.add_head(20)
T.add_head(30)
T.add_head(30)
T.add_head(30)
T.show()
# 按位置修改
T.re_index(2,100)
T.show()
# 按值修改
T.re_value(30, 300)
T.show()
# 按值查找返回值
t = T.value_index(20)
print(t)
# 反转
T.reverse()
T.show()