1,主程序

  1. """
  2. LinkList.py
  3. 功能:实现单链表的构建和功能操作
  4. 重点代码:
  5. """
  6. # 创建节点类,实例化对象--->将在内存中随意开辟空间
  7. class Node:
  8. def __init__(self, value, next=None):
  9. self.value = value # 有用的数据
  10. self.next = next # 循环指向下一个节点,没有数据意义,但有逻辑意义
  11. node1 = Node(1)
  12. node2 = Node(2, node1) # node2.next = node1
  13. node3 = Node(3, node2) # node3.next = node2
  14. a = 1
  15. b = (2, a)
  16. c = (3, b)
  17. class LinkList:
  18. """
  19. 思路: 单链表类,生成对象可以进行增删改查等操作
  20. 具体操作可以通过调用方法完成
  21. """
  22. def __init__(self):
  23. """
  24. 初始化链表,标记一个链表的开端,以便于获取后续的节点
  25. 两种方法:初始化一个节点;初始化一个变量
  26. """
  27. self.head = Node(None)
  28. # 通过list_为链表添加一组节点
  29. def init_list(self, list_): # 传入列表,为了与关键字区分,遂加入下划线
  30. p = self.head # p作为牺牲的变量,可以移动
  31. for i in list_:
  32. p.next = Node(i)
  33. p = p.next
  34. # 遍历链表
  35. def show(self):
  36. p = self.head.next # 第一个有效节点
  37. while p is not None: # 判断对象是否相等用 is / is not ; 判断值是否相等用== / !=
  38. print(p.value)
  39. p = p.next # p 向后移动
  40. # 判断链表是否为空,通过头节点的next指针
  41. def is_empty(self):
  42. if self.head.next is None:
  43. return True
  44. else:
  45. return False
  46. def clear(self):
  47. self.head.next = None # 仅仅是断开头节点与其他数据节点,数据节点会被Python内存回收机制清理
  48. # 尾部插入
  49. def append(self, val):
  50. p = self.head
  51. while p.next is not None:
  52. p = p.next
  53. p.next = Node(val)
  54. # 头部插入
  55. def head_insert(self, val):
  56. node = Node(val) # 生成一个节点
  57. node.next = self.head.next # 将插入节点与头节点的next指针连接
  58. self.head.next = node # 再将head的next指针指向插入节点【如果不这样做,那么就会导致数据节点与头节点失联,等同于线性表链式存储的清空操作】
  59. # 指定位置插入
  60. def insert(self, index, val):
  61. """
  62. 解决思路:首先应该找到插入的位置;生成节点,指针先指向被插入位置的后一个元素;再指向被插入位置的前一个元素;
  63. 插入位置的确定:从初始化的第一个元素算起,移动次数即为插入位置的索引值;
  64. 移动方式:首先令新节点的位置等于头节点,然后根据目标位置确定移动次数,比如在索引值为2的位置插入,则移动两次
  65. 评价:链表和列表插入值的平均复杂度没有太大差别
  66. """
  67. p = self.head
  68. for i in range(index):
  69. if p.next is None: # 超出索引值位置的最大范围,结束循环
  70. break
  71. p = p.next
  72. node = Node(val)
  73. node.next = p.next
  74. p.next = node
  75. def delete(self, x): # x:被删除对象
  76. p = self.head
  77. # 结束循环必然存在一个条件为假
  78. while p.next and p.next.value != x: # 新建节点,指向下一个元素的节点不能再指向为空
  79. p = p.next
  80. if p.next is None:
  81. raise ValueError("x is not in LinkList.") # 如果指向空数据结构
  82. else:
  83. p.next = p.next.next
  84. def get_index(self, index):
  85. if index < 0: # 判断输入值的范围,不支持小于零的索引方式
  86. raise IndexError("index out of range.")
  87. p = self.head.next
  88. for i in range(index):
  89. if p.next is None: # 如果next指针指向空节点,则超出范围,抛出报错
  90. raise IndexError("index out of range.")
  91. p = p.next
  92. return p.value
  93. l = LinkList()
  94. l.init_list([2, 5, 3, 8, 6])
  95. l.show()

2,测试程序

  1. from LineTable.Linklist import *
  2. import time
  3. l = []
  4. for i in range(999999):
  5. l.append(i)
  6. link = LinkList()
  7. link.init_list(l)
  8. tm = time.time()
  9. # for i in l:
  10. # print(i) # 列表
  11. # link.show() # 链表
  12. # l.append(8866)
  13. # link.append(8866) # 尾插
  14. # l.insert(0,8866)
  15. # link.head_insert(8866) # 头插
  16. # link.insert(100, 3576) # 指定位置插入
  17. # link.show()
  18. # link.delete(1) # 删除
  19. # l.remove(1)
  20. print("-----------------------------")
  21. # link.show()
  22. # link.show()
  23. # print("-----------------------------")
  24. # print(link.get_index(4))
  25. print("time: ", time.time() - tm)