首页 > 其他 > 详细

单向链表

时间:2021-01-05 20:51:59      阅读:45      评论:0      收藏:0      [点我收藏+]

单链特点:

  • 单向性即只有一个顺序方向
  • 存储空间可以不连续

 

一般包含两个区域数据区域(信息/元素域)和 连接域。
 

存储结构

技术分享图片

 

 

 

代码实现

  类属性

  • elem 存数据
  • next 为后一个的位置(后继节点位置)
  • 最后一个next 为空
  • head 头节点(需要使用head 来指明链表的开始位置)

 

  链表操作(自己实现)
  • is_empty() 链表是否为空
  • length() 链表长度
  • travel() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 边表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点(删除找到的第一个)
  • search(item) 查找节点是否存在
# 用来表示节点
class
Node: def __init__(self, elem): self.elem = elem self.next = None
# 链表
class SingleLinkList: def __init__(self, node=None): self.__head = node # 判断是否为空, __head 为空即为空 def is_empty(self): return self.__head == None # 判断长度 def length(self): cur = self.__head # 用来遍历链表 count = 0 while cur != None: count += 1 cur = cur.next return count # 遍历链表 def travel(self): cur = self.__head # 用来遍历链表 while cur != None: print(cur.elem, end=" ") cur = cur.next print() # 链表头部添加 def add(self, item): node = Node(item) node.next = self.__head self.__head = node # 尾部插入 item 为数据, 在内部封装为节点 def append(self, item): cur = self.__head node = Node(item) if self.is_empty(): self.__head = node else: while cur.next != None: # 指向最后一个节点 cur = cur.next cur.next = node def insert(self, pos, item): # insert(2, 100) """ pos 下标,从0开始 """
     # 输入的值为负数,默认头插
if pos <= 0: self.add(item) elif pos >= self.length() - 1: # 默认尾插 self.append(item) else: cur = self.__head node = Node(item) count = 0 while count < item - 1: cur = cur.next count += 1 node.next = cur.next cur.next = node # 删除找到的第一个 def remove(self, item): pre = None cur = self.__head while cur != None: if cur.elem == item: # 如果目标节点是头节点 if pre == None: self.__head = cur.next # 其他节点和尾节点 else: pre.next = cur.next return cur.elem else: pre = cur cur = cur.next def search(self, item): cur = self.__head while cur != None: if cur.elem == item: return True else: cur = cur.next return False if __name__ == "__main__": ll = SingleLinkList() print(ll.is_empty()) print(ll.length()) ll.append(1) ll.append(2) ll.append(3) ll.add(100) ll.append(4) ll.append(5) ll.append(6) ll.insert(100, 111) ll.insert(-100, 112) print(ll.length()) ll.travel() ll.remove(6) ll.travel() ll.remove(112) ll.travel() ll.remove(111) ll.travel()

结果

True
0
9
112  100  1  2  3  4  5  6  111  
112  100  1  2  3  4  5  111  
100  1  2  3  4  5  111  
100  1  2  3  4  5  

 

在python 中链表结构实际上很好理解, 将 后一个节点赋值给前一个节点的next值即可。

因为python 中的赋值概念是让变量指向值的地址,这与我们next概念相符。

例如:

a = 10

会先在内存中开辟一块空间存储10,让 a  指向 这块地址。

单向链表

原文:https://www.cnblogs.com/ShanCe/p/14237430.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!