链表结构
class Node:
def __init__(self, item, next_):
self.item = item # 数据域
self.next_ = next_ # 指针域(指向下一个节点)
class LinkList:
# 初始化
def __init__(self):
# 初始化头结点
self.head: Node = Node(None, None)
# 初始化链表长度
self.length: int = 0
# 清空链表
def clear(self):
self.head.next_ = None
self.length = 0
# 获取长度
def get_length(self) -> int:
return self.length
# 判断链表是否为空
def is_empty(self):
return self.length == 0
# 获取指定位置的元素
def get_item(self, index):
node_t: Node = self.head.next_ # 从头结点开始
for i in range(index):
node_t = node_t.next_ # 依次向后跳index次即可
return node_t.item
# 追加元素
def append(self, item):
# 找到最后一个节点
node_t: Node = self.head
while node_t.next_ is not None: # 循环查找直到指针域为空为最后节点
node_t = node_t.next_
# 创建新节点,保存元素
node_new: Node = Node(item, None)
# 最后一个节点指向新节点
node_t.next_ = node_new
# 长度+1
self.length += 1
# 任意位置插入元素
def insert(self, item, index):
node_pre: Node = self.head.next_
# 找到插入位置的前一个节点
for i in range(index - 1): # 向后跳index-1次即可
node_pre = node_pre.next_
# 找到插入位置的节点
node_curr = node_pre.next_
# 创建新节点,指向插入位置的节点
node_new: Node = Node(item, node_curr)
# 插入位置的前一个节点指向新节点
node_pre.next_ = node_new
# 长度+1
self.length += 1
# 删除指定位置的元素,返回该元素
def delete(self, index):
# 找到当前位置的前一个节点
node_pre: Node = self.head
for i in range(index - 1):
node_pre = node_pre.next_
# 找到当前位置的节点
node_curr: Node = node_pre.next_
# 找到当前位置的后一个节点
node_next: Node = node_curr.next_
# 将前一个节点的指针指向后一个节点
node_pre.next_ = node_next
# 长度-1
self.length -= 1
return node_curr.item
# 查找元素的位置
def get_index(self, item):
# 从头节点开始遍历每一个节点,比较item
node_t: Node = self.head
# 记录位置
index = 0
while node_t.next_ is not None:
node_t = node_t.next_ # 节点后跳
if node_t.item == item:
return index
index += 1 # 计数+1
return -1
# 遍历打印链表
def show_items(self):
node_t: Node = self.head
if self.length > 0:
while node_t.next_ is not None:
node_t = node_t.next_
print(node_t.item, end=' ')
print()
else:
print('empty')
# 反转全部节点
def reverse(self):
# 判断是否为空链表
if self.is_empty():
return
else:
self.reverse_node(self.head.next_) # 从头节点的下一个节点开始反转
# 反转单个节点
def reverse_node(self, curr: Node):
# 递归出口, 遍历到最后一个节点时,不需要继续反转curr的下一个节点
if curr.next_ is None: # 如果递归遍历到最后一个节点
self.head.next_ = curr # 头节点指向最后一个节点
return curr # 返回反转后的节点
# 需要将当前节点的下一个节点反转
# 递归反转curr的下一个节并返回
pre = self.reverse_node(curr.next_)
# 反转后的节点指向当前节点,反转后的节点在前,当前节点在后
pre.next_ = curr
# 当前节点在后,指针域为空
curr.next_ = None
# 返回反转后的节点
return curr
if __name__ == '__main__':
link = LinkList()
link.append('node1')
link.append('node2')
link.append('node3')
link.show_items()
link.insert('insert item', 2)
link.show_items()
print(link.get_index('node3'))
print(link.get_item(2))
print(link.delete(1))
link.show_items()
link.reverse()
link.show_items()
print(link.is_empty())
link.clear()
print(link.is_empty())
版权声明:本文为bua200720411091原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。