1,主程序
"""
LinkList.py
功能:实现单链表的构建和功能操作
重点代码:
"""
# 创建节点类,实例化对象--->将在内存中随意开辟空间
class Node:
def __init__(self, value, next=None):
self.value = value # 有用的数据
self.next = next # 循环指向下一个节点,没有数据意义,但有逻辑意义
node1 = Node(1)
node2 = Node(2, node1) # node2.next = node1
node3 = Node(3, node2) # node3.next = node2
a = 1
b = (2, a)
c = (3, b)
class LinkList:
"""
思路: 单链表类,生成对象可以进行增删改查等操作
具体操作可以通过调用方法完成
"""
def __init__(self):
"""
初始化链表,标记一个链表的开端,以便于获取后续的节点
两种方法:初始化一个节点;初始化一个变量
"""
self.head = Node(None)
# 通过list_为链表添加一组节点
def init_list(self, list_): # 传入列表,为了与关键字区分,遂加入下划线
p = self.head # p作为牺牲的变量,可以移动
for i in list_:
p.next = Node(i)
p = p.next
# 遍历链表
def show(self):
p = self.head.next # 第一个有效节点
while p is not None: # 判断对象是否相等用 is / is not ; 判断值是否相等用== / !=
print(p.value)
p = p.next # p 向后移动
# 判断链表是否为空,通过头节点的next指针
def is_empty(self):
if self.head.next is None:
return True
else:
return False
def clear(self):
self.head.next = None # 仅仅是断开头节点与其他数据节点,数据节点会被Python内存回收机制清理
# 尾部插入
def append(self, val):
p = self.head
while p.next is not None:
p = p.next
p.next = Node(val)
# 头部插入
def head_insert(self, val):
node = Node(val) # 生成一个节点
node.next = self.head.next # 将插入节点与头节点的next指针连接
self.head.next = node # 再将head的next指针指向插入节点【如果不这样做,那么就会导致数据节点与头节点失联,等同于线性表链式存储的清空操作】
# 指定位置插入
def insert(self, index, val):
"""
解决思路:首先应该找到插入的位置;生成节点,指针先指向被插入位置的后一个元素;再指向被插入位置的前一个元素;
插入位置的确定:从初始化的第一个元素算起,移动次数即为插入位置的索引值;
移动方式:首先令新节点的位置等于头节点,然后根据目标位置确定移动次数,比如在索引值为2的位置插入,则移动两次
评价:链表和列表插入值的平均复杂度没有太大差别
"""
p = self.head
for i in range(index):
if p.next is None: # 超出索引值位置的最大范围,结束循环
break
p = p.next
node = Node(val)
node.next = p.next
p.next = node
def delete(self, x): # x:被删除对象
p = self.head
# 结束循环必然存在一个条件为假
while p.next and p.next.value != x: # 新建节点,指向下一个元素的节点不能再指向为空
p = p.next
if p.next is None:
raise ValueError("x is not in LinkList.") # 如果指向空数据结构
else:
p.next = p.next.next
def get_index(self, index):
if index < 0: # 判断输入值的范围,不支持小于零的索引方式
raise IndexError("index out of range.")
p = self.head.next
for i in range(index):
if p.next is None: # 如果next指针指向空节点,则超出范围,抛出报错
raise IndexError("index out of range.")
p = p.next
return p.value
l = LinkList()
l.init_list([2, 5, 3, 8, 6])
l.show()
2,测试程序
from LineTable.Linklist import *
import time
l = []
for i in range(999999):
l.append(i)
link = LinkList()
link.init_list(l)
tm = time.time()
# for i in l:
# print(i) # 列表
# link.show() # 链表
# l.append(8866)
# link.append(8866) # 尾插
# l.insert(0,8866)
# link.head_insert(8866) # 头插
# link.insert(100, 3576) # 指定位置插入
# link.show()
# link.delete(1) # 删除
# l.remove(1)
print("-----------------------------")
# link.show()
# link.show()
# print("-----------------------------")
# print(link.get_index(4))
print("time: ", time.time() - tm)