使用python实现单向循环链表,供大家参考,具体内容如下

单向循环链表

将所有的链接在一起,每一个节点分为数据存储区和链接区,数据区存储数据,链接区链接下一个节点

item: 存储数据的地方
next: 链接下一个节点
注意: 单向循环链表是首位链接,即尾部的节点要和头部的节点链接

单向链表操作

1、链表是否为空
2、链表的长度
3、遍历链表
4、链表头部添加元素
5、链表尾部添加元素
6、链表指定位置添加元素
7、链表删除节点
8、查找节点是否存在

Python客栈送红bao、纸质书

代码实现
`# Functions 函数声明
class Node():
“””实例化节点类”””
def init(self, item):
self.item = item
self.next = None

class Linklist():
“””
存放节点类
“””
def init(self):
self.head = None

  1. # 1. 链表是否为空
  2. def is_empty(self):
  3. return self.head == None
  4. # 2. 链表的长度
  5. def length(self):
  6. """
  7. 返回链表的长度
  8. 遍历所有的节点,使用计数器计数
  9. 1、链表为空情况
  10. """
  11. # 实例化节点
  12. cur = self.head
  13. if self.is_empty():
  14. return 0
  15. else:
  16. # 计数
  17. count = 1
  18. # 遍历链表
  19. while cur.next != self.head:
  20. count+=1
  21. cur = cur.next
  22. return count
  23. # 3. 遍历链表
  24. def travel(self):
  25. """
  26. 遍历链表,获取所有的数据
  27. 实例游标,遍历数据,输出数据
  28. 1、 空链表情况
  29. 2、 只有头部节点情况
  30. 3、 只有尾部节点情况
  31. """
  32. # 实例化游标
  33. cur = self.head
  34. if self.is_empty():
  35. return None
  36. else:
  37. # 遍历数据
  38. while cur.next != self.head:
  39. print(cur.item, end=' ')
  40. cur = cur.next
  41. # 最后一个节点要单独输出
  42. print(cur.item)
  43. # 4. 链表头部添加元素
  44. def add(self, item):
  45. """
  46. 往链表头部添加数据
  47. 分析
  48. 链表为空
  49. self.head 直接指向node, 再讲node指向自己
  50. 链表不为空
  51. node.next = self.head
  52. """
  53. # 实例化游标
  54. cur = self.head
  55. # 实例化节点
  56. node = Node(item)
  57. # 判断是否为空
  58. if self.is_empty():
  59. self.head = node
  60. node.next = node
  61. else:
  62. # 不为空的情况
  63. # 要将最后一个节点指向node
  64. while cur.next != self.head:
  65. cur = cur.next
  66. node.next = self.head
  67. self.head = node
  68. cur.next = node
  69. # 5. 链表尾部添加元素
  70. def append(self, item):
  71. """
  72. 往尾部添加数据
  73. 分析
  74. 实例化节点,再实例化游标先指向最后一个节点
  75. 调换指向
  76. 1、空链表情况
  77. 2、只有一个链表情况
  78. """
  79. # 实例化节点
  80. node = Node(item)
  81. # 实例化游标
  82. cur = self.head
  83. # 判断是否为空
  84. if self.is_empty():
  85. self.add(item)
  86. else:
  87. # 不为空的情况,移动游标指向最后一个节点
  88. while cur.next != self.head:
  89. cur = cur.next
  90. node.next = self.head
  91. cur.next = node
  92. pass
  93. # 6. 链表指定位置添加元素
  94. def insert(self, index, item):
  95. """
  96. 指定位置添加数据
  97. 实例化节点, 实例化游标指向索引的数据,更改指向
  98. 位置大小
  99. 链表是否为空
  100. """
  101. # 实例化节点
  102. node = Node(item)
  103. # 实例化游标
  104. cur = self.head
  105. if index <=0:
  106. self.add(item)
  107. elif index > (self.length()-1):
  108. self.append(item)
  109. else:
  110. # 判断链表是否为空
  111. if self.is_empty():
  112. self.add(item)
  113. else:
  114. # 移动游标,指向指定的索引位置
  115. count = 0
  116. while count < index-1:
  117. count+=1
  118. cur = cur.next
  119. node.next = cur.next
  120. cur.next = node
  121. pass
  122. # 7. 链表删除节点
  123. def remove(self, item):
  124. """
  125. 删除指定的节点
  126. 实例化游标,遍历链表插件这个节点是否存在,存在则更改指向
  127. 不存在,则不修改
  128. 空链表情况
  129. 头节点情况
  130. 尾结点情况
  131. """
  132. # 实例化游标
  133. cur = self.head
  134. if self.is_empty():
  135. return None
  136. else:
  137. # 不为空,遍历链表,对比数据是否相等
  138. # 如果头节点是要删除的数据
  139. if cur.item == item:
  140. self.head=cur.next
  141. # 找出最后的节点,将最后的节点指向,删除后面的那个节点
  142. while cur.next != self.head:
  143. cur = cur.next
  144. cur.next = cur.next
  145. else:
  146. pro = None
  147. while cur.next != self.head:
  148. if cur.item == item:
  149. if cur.item == item:
  150. pro.next = cur.next
  151. return True
  152. else:
  153. pro = cur
  154. cur = cur.next
  155. if cur.item == item:
  156. pro.next = self.head
  157. pass
  158. # 8. 查找节点是否存在
  159. def search(self, item):
  160. """
  161. 查找该节点是否存在
  162. 实例化游标,遍历所有的节点
  163. 查看当前节点的数据是否和item 相等
  164. 空链表
  165. 头节点
  166. 尾结点
  167. """
  168. # 实例化游标
  169. cur = self.head
  170. # 判断空链表
  171. if self.is_empty():
  172. return None
  173. else:
  174. # 不为空遍历整个链表
  175. if cur.item == item:
  176. return True
  177. else:
  178. while cur.next != self.head:
  179. if cur.item == item:
  180. return True
  181. else:
  182. cur = cur.next
  183. if cur.item == item:
  184. return True
  185. pass`

测试运行
`# 程序的入口
if name == “main“:
a = Linklist()
a.add(400)
a.add(300)
a.add(200)
a.add(100)

  1. # a.append(10)
  2. a.insert(4,6)
  3. # a.remove(6)
  4. print(a.length()) # 5
  5. a.travel() # 100 200 300 400 6
  6. print(a.search(100)) # True
  7. pass`

更多相关文章

  1. Android(安卓)解决Could not find com.android.tools.build:grad
  2. Android之如何使用junit
  3. Android根据电话号码取得联系人姓名及头像
  4. Android解析XML文件的三种方式
  5. Android之USB Camera摄像头节点后移
  6. android中使用properties文件配置
  7. android软件安全攻防实例第一章笔记
  8. Android布局优化
  9. 【Android】How Android(安卓)Draws Views

随机推荐

  1. wampserver怎么下载
  2. PHP如何实现短网址
  3. php适合做微服务么
  4. php array_chunk函数怎么用
  5. php技术栈是什么
  6. php中的array_fill函数怎么用
  7. php怎么做页面静态化
  8. php中的array_combine函数怎么用
  9. php levenshtein函数怎么用
  10. php中的count_chars函数怎么用