Python算法实例精简
链表(link)
class Node:
def __init__(self, data):
self.data = data
self.next = None
return
def has_value(self, value):
if self.data == value:
return True
else:
return False
#! 定义一个值为 1 的节点
#? Node(1)
#链表类
'''
head -> 头节点
tail -> 尾节点
length -> 长度
'''
'''
isempty()
add_Node(self, item)
insert_node(self, index, data)
delete_node_byid(self, item_id)
find_node(self, value)
print_link(self)
'''
class singlelink:
def __init__(self):
self.head = None
self.tail = None
self.length = 0
return
def isempty(self):
return self.length == 0
#? 尾部添加节点
def add_Node(self, item):
if not isinstance(item, Node): #! isinstance(对象, 类)检查是否是这个类
item = Node(item)
if self.head is None:
self.head = item
self.tail = item
else:
self.tail.next = item
self.tail = item
self.length += 1
return
#? 插入节点
def insert_node(self, index, data):
if self.isempty(): # 如果链表为空
if index == 0: # 在索引0的位置插入节点
self.head = Node(data)
self.tail = self.head
else:
print("error: out of index")
else: # 如果链表不为空
if index < 0 or index > self.length: # 如果插入位置不在链表范围内
print("error: out of index")
else:
item = Node(data) # 创建节点
if index == 0: # 如果插入位置为链表头部
item.next = self.head
self.head = item
else:
node = self.head
j = 0
while j < index - 1 and node.next: # 找到插入位置的前一个节点
node = node.next
j += 1
item.next = node.next # 在插入位置插入节点
node.next = item
self.length += 1 # 链表长度加1
#? 通过索引删除节点
def delete_node_byid(self, item_id):
if self.isempty(): # 如果链表为空
print("error: link is empty")
return
id = 1
current_node = self.head # 当前节点
previous_node = None
while current_node: # 当当前节点不为空时
if id == item_id:
if previous_node is not None:
previous_node.next = current_node.next
else:
self.head = current_node.next # 如果上一个节点是空的(也就是link是空的)
return
previous_node = current_node
current_node = current_node.next # 这两行是为了把指针向下一个节点移动
id += 1
self.length -= 1
#? 通过数值在链表中找到节点
def find_node(self, value):
current_node = self.head
node_id = 1
results = [] # 可能存在多个一样的值
while current_node is not None:
if current_node.has_value(value):
results.append(node_id)
current_node = current_node.next
node_id += 1
return results
#? 按顺序输出链表
def print_link(self):
current_node = self.head
while current_node is not None:
print(current_node.data,end=' ')
current_node = current_node.next
return
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
print('-----------')
link = singlelink()
for node in [node1,node2,node3]:
link.add_Node(node)
link.print_link()
print(f"链表长度为{link.length}")
print('-----------')
link.insert_node(2,6)
link.print_link()
print(f"链表长度为{link.length}")
link.delete_node_byid(1)
link.print_link()
print(f"链表长度为{link.length}")
link.add_Node(Node(2))
link.print_link()
print()
print(f"find 2 element : {link.find_node(2)}")
print('-----------')
❤️ 欢迎你的到来! ❤️