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 = node1node3 = Node(3, node2) # node3.next = node2a = 1b = (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.valuel = LinkList()l.init_list([2, 5, 3, 8, 6])l.show()
2,测试程序
from LineTable.Linklist import *import timel = []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)