线性结构的链式存储
定义: 将每个结点分布在存储器的不同存储块中,每个结点(尾结点除外)都持有一个指向下一结点的引用,所得到的存储结构为链表结构
如图所示
特点:
- 逻辑上相邻的元素,其存储位置不一定相邻
- 存储稀疏,不用开辟整块存储空间
- 对结点的插入和删除等操作运算效率较高
- 逻辑结构复杂,不利于遍历
代码实现:
"""
自定义结点生成类 Node.py
"""
class Node:
def __init__(self, value, ptr_next = None):
"""
:param val: 结点自身数据
:param ptr_next: 循环下一个结点
"""
self.value = value
self.ptr_next = ptr_next
"""
自定义链表类,对链表的增删改查操作 LinkList.py
"""
from Node import *
class LinkList:
def __init__(self):
"""
创建一个头节点
"""
self.head = Node(None)
def clear_link(self):
"""
清空链表
:return:
"""
if self.head.ptr_next is not None:
self.head.ptr_next = None
def end_append(self, node):
"""
在尾部新增一个结点 (尾插法)
:param node: 结点
:return:
"""
p = self.head
# 先遍历找到链表中最后一个结点
while p.ptr_next is not None:
p = p.ptr_next
# 将最后一个结点的ptr_next指向新增加的结点
p.ptr_next = node
def head_append(self, node):
"""
在链表的头部插入新结点(头插法)
:param node: 结点
:return:
"""
node.ptr_next = self.head.ptr_next
self.head.ptr_next = node
def index_append(self, index, node):
"""
在指定位置插入结点
:param index: 指定的位置
:param node: 插入的结点
:return:
"""
p = self.head
for item in range(index):
if p.ptr_next is None:
break
p = p.ptr_next
node.ptr_next = p.ptr_next
p.ptr_next = node
def move_link(self, value):
"""
删除结点
:param value: 删除的对应元素的值
:return:
"""
p = self.head
while p.ptr_next and p.ptr_next.value != value:
p = p.ptr_next
# 删除的元素不在链表中异常
if p.ptr_next is None:
raise ValueError("value is not LinkList")
else:
p.ptr_next = p.ptr_next.ptr_next
def get_value(self, index):
"""
获取某个结点
:param index: 需要获取的值的索引
:return: 获取某个结点的值
"""
if index < 0:
# 索引小于0异常
raise ValueError("value is not LinkList")
p = self.head.ptr_next
for i in range(index):
if p.ptr_next is None:
# 要获取的结点不在链表中异常
raise IndexError("LinkList index out of range")
p = p.ptr_next
return p.value
def set_index_link(self, index, new_value):
"""
修改结点
:param index: 需要修改的结点的索引
:param new_value: 需要修改的值
:return:
"""
p = self.head.ptr_next
for i in range(index):
# 需要修改的索引值不在链表中异常
if p.ptr_next is None:
raise IndexError("LinkList index out of range")
p = p.ptr_next
p.val = new_value
def is_empty(self):
"""
判断链表是否为空
:return: True 链表为空
False 链表不为空
"""
if self.head.ptr_next is None:
return True
else:
return False
def print_show(self):
"""
打印链表中的所有元素
"""
p = self.head.ptr_next
while p is not None:
print(p.value)
p = p.ptr_next