class Node:
def __init__(self, value):
"""
:params: value 值
:params: next 链接节点
"""
self.value = value
self.next = None
def __repr__(self) -> str:
return f"Node<{self.value}>"
class LinkList:
head: Node = None
length: int = None
def create_node(self, value) -> Node:
return Node(value)
@property
def is_empty(self):
"""判断链表是否为空"""
return self.head is None
@property
def length(self):
"""长度"""
current_node = self.head
count = 0
while current_node:
count += 1
current_node = current_node.next
return count
def search_node_by_value(self, value):
"""按值查找节点"""
current_node = self.head
if not current_node:
return None
while current_node and current_node.value != value:
current_node = current_node.next
return current_node
def search_node_by_index(self, position: int):
"""按索引查找节点"""
current_node = self.head
if not current_node:
return None
index = 0
while current_node and index < position:
index += 1
current_node = current_node.next
return current_node
def update_node_by_index(self, position: int, value):
"""
按索引修改节点
:params: position 查找索引
:params: value 值
"""
current_node = self.head
if not current_node:
return None
index = 0
while current_node and index < position:
index += 1
current_node = current_node.next
current_node.value = value
return current_node
def append(self, value):
"""
从尾部插入节点
:params: value 值
"""
current_node = self.head
node = self.create_node(value)
while current_node and current_node.next:
current_node = current_node.next
current_node.next = node
def insert(self, position, value):
"""
从中间插入节点
:params: position 插入位置
:params: value 值
"""
current_node = self.head
index = 0
if position > self.length - 1:
return
node = self.create_node(value)
while index < position:
index += 1
current_node = current_node.next
node.next = current_node.next
current_node.next = node
def add(self, value):
"""
从头部插入节点
:params: value 值
"""
current_node = self.head
node = self.create_node(value)
node.next = head.next
head.next = node
def remove(self, value):
"""删除"""
current_node = self.head
pre = None
while current_node:
if current_node.value == value:
# 是否头节点
if not pre:
self.head = current_node.next
else:
pre.next = current_node.next
break
else:
pre = current_node
current_node = current_node.next
def travel(self):
"""
遍历
"""
print("*"*20)
current_node = self.head
while current_node:
print(f"{current_node}", end="->")
current_node = current_node.next
print()
if __name__ == '__main__':
linklist = LinkList()
head = linklist.create_node(11)
linklist.head = head
linklist.add(41)
node = linklist.append(21)
node = linklist.append(31)
linklist.travel()
node = linklist.search_node_by_index(1)
print(node)
linklist.insert(2, 56)
linklist.travel()
node = linklist.update_node_by_index(2, 78)
print(node)
linklist.travel()
linklist.remove(56)
linklist.travel()
输出:
********************
Node<11>->Node<41>->Node<21>->Node<31>->
Node<41>
********************
Node<11>->Node<41>->Node<21>->Node<56>->Node<31>->
Node<78>
********************
Node<11>->Node<41>->Node<78>->Node<56>->Node<31>->
********************
Node<11>->Node<41>->Node<78>->Node<31>->