链表的知识总结

打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

链式结构内存不连续的,而是一个个串起来的,每个链接表的节点保存一个指向下一个节点的指针。
⭐ 链式结构包含:node(节点)还有value(值),由于内存不连续的,那么对于数据的插入,只需找到一个节点便可以插入数据,这也是链表优于列表的一个优点,反之,对于数据的删除,由于不是连续的,不能通过索引删除数据,只能一一遍历删除元素。 ⭐ 接下来上代码 单链表的增删功能
  1. # 定义一个结点的类
  2. class Node():
  3.     def __init__(self,value=None,next=None):
  4.         self.next = next
  5.         self.value = value
  6.    
  7.     def __str__(self):
  8.         return "Node:{}".format(self.value)
  9. # 定义一个连接点的类
  10. class Linklist():
  11.     def __init__(self):
  12.         self.root = Node()
  13.         self.size = 0
  14.         self.next = None  # 增加新数据时,将信数据的地址与谁关联
  15.     # 只要是追加 就要创造节点
  16.     def append(self,value):
  17.         node = Node(value)
  18.         # 判断root节点下面是否有数据
  19.         if not self.next: # 如果没有节点
  20.             self.root.next = node  # 将新节点挂在root后面
  21.         else:
  22.             self.next.next = node  # 将新节点挂在最后一个节点上  
  23.         self.next = node # 重新赋值 一开始的是None
  24.         self.size += 1
  25.    
  26.     def append_first(self,value):
  27.         # 只要是追加 就要创造节点
  28.         node = Node(value)
  29.         # 判断root下面是否存在节点
  30.         if not self.next:
  31.             self.root.next = node
  32.             self.next = node
  33.         else:
  34.             temp = self.root.next # 获取原来root后面的那个节点
  35.             self.root.next = node #  将新节点挂在root后面
  36.             node.next = temp # 新的节点的下一个节点是原来的root的节点
  37.    
  38.     # 迭代链表
  39.     def __iter__(self):
  40.         # 获得root节点下面的数据
  41.         current = self.root.next
  42.         # 判断current是否有之 由于一开始赋予value和next没有值 所以进行判断 否则报错
  43.         if current:
  44.             # 判断时候有下一个节点 有的话则返回下一个结点的值
  45.             while current is not self.next: # self.next可以列结成最后一个节点
  46.                 yield current
  47.                 current = current.next
  48.             yield current
  49.    
  50.     # 查找数据
  51.     def find(self,value):
  52.         for n in self.__iter__():
  53.             if n.value == value:
  54.                 return n
  55.    
  56.     # 查找出现的次数
  57.     def find_count(self,value):
  58.         count = 0
  59.         for n in self.__iter__():
  60.             if n.value == value:
  61.                 count += 1
  62.         return count
  63.    
  64.     # 移除数据(链表的移除,需要逐一遍历,找到当前元素的节点,再删除)
  65.     def remove(self,value):
  66.         prve = self.root
  67.         for n in self.__iter__():
  68.             # 判断节点的值与要删除的值是否相等
  69.             if n.value == value:
  70.                 # 查看是不是最后一个节点
  71.                 if n == self.next:
  72.                     # 更新倒数第二节点的关系
  73.                     prve.next = None
  74.                     # 更新最后一个节点为原倒数第二个节点
  75.                     self.next = prve
  76.                 prve.next = None
  77.                 # 删除当前节点
  78.                 del n
  79.                 # 链表大小减少
  80.                 self.size -= 1
  81.                 return True
  82.             prve = n
  83.    
  84.     def remove_all(self,value):
  85.         prve =self.root
  86.         for n in self.__iter__():
  87.             if n.value == value:
  88.                 if n == self.next:
  89.                     prve.next = None
  90.                     self.next = prve
  91.                 prve.next = n.next
  92.                 # 删除当前节点
  93.                 del n
  94.                 # 链表大小减少
  95.                 self.size -= 1
  96.                 return True
  97.             prve = n
  98. if __name__ == "__main__":
  99.     link = Linklist()
  100.     link.append("孙悟空")   
  101.     link.append("猪八戒")   
  102.     link.append("孙悟空")   
  103.     link.append("猪八戒")   
  104.     link.append("猪八戒")   
  105.     link.append("唐僧")   
  106.     link.append_first("唐僧")
  107.     link.append_first("唐僧")
  108.     # for v in link:
  109.     #     print(v)
  110.     # print(link.find('孙悟空'))
  111.     # print(link.find_count('唐僧'))  
  112.     print("**************删除之前的数据******************")
  113.     for v in link:
  114.         print(v)
  115.     link.remove('唐僧')
  116.     link.remove('唐僧')
  117.     link.remove('唐僧')
  118.     link.remove('唐僧')
  119.     link.remove('孙悟空')
  120.     link.remove('猪八戒')
  121.     link.remove_all("猪八戒")
  122.     link.remove_all("孙悟空")
  123.     link.remove_all("唐僧")     
  124.     print("**************删除之后的数据******************")
  125.     for v in link:
  126.         print(v)        
复制代码

 
 
 
 ⭐ 接下来上代码 双链表的增删功能:
  1. # 定义一个结点的类
  2. class Node():
  3.     def __init__(self,value=None,node=None,next=None):
  4.         self.value = value
  5.         self.node = node
  6.         self.next = next
  7.     def __str__(self):
  8.         return "Node:{}".format(self.value)
  9.    
  10. # 定义一个连接点的类
  11. class DoubleLinkedList():
  12.     def __init__(self):
  13.         self.root = Node()
  14.         self.size = 0
  15.         self.end = None
  16.    
  17.     def append(self,value):
  18.         node = Node(value)
  19.         # 判断root节点下面是否有数据
  20.         if not self.end: # 如果没有元素
  21.             self.root.next = node  # 将root 的下一个节点 设置为新的node节点
  22.             node.prev = self.root  # 设置新节点的 上一个节点 为 root
  23.         else:
  24.             self.end.next = node  # 将原来最后节点的下一个节点 设置为新的node节点
  25.             node.prev = self.end # 设置新节点的 上一个节点 为 原来的最后一个节点
  26.         self.end = node # 更新最后 一个节点新加的node节点
  27.         self.size += 1
  28.    
  29.     def append_first(self,value):
  30.         node = Node(value) # 封装节点对象
  31.         # 判断是否已经有数据
  32.         if not self.end:# 如果没有元素
  33.             self.end = node # 更新最后 一个节点新加的node节点
  34.         else:
  35.             # temp指向node,node指向root,root指向temp
  36.             temp = self.root.next # 保存原来的第一个节点
  37.             node.next = temp # 设置新节的下一个节为原来的 第一个节点
  38.             temp.prev = node # 更新原来的第一个节点的上一个节点位置为 新的node节点
  39.         node.prev = self.root # 设置新节点的 上一个节点 为 root
  40.         self.root.next = node # 将root 的下一个节点 设置为新的node节点
  41.         self.size += 1
  42.     # 正序循环
  43.     def __iter__(self):
  44.         current = self.root.next
  45.         if current:
  46.             while current is not self.end:
  47.                 yield current.value
  48.                 current = current.next
  49.             yield current.value
  50.    
  51.     # 倒叙循环
  52.     def revers_iter(self):
  53.         current  = self.end #获取最后一节点
  54.         if current:
  55.             while current is not self.root:
  56.                 yield current
  57.                 current = current.prev
  58. if __name__ == "__main__":
  59.     link = DoubleLinkedList()
  60.     link.append('孙悟空')
  61.     link.append('猪八戒')
  62.     link.append_first('唐三藏')
  63.     for v in link:
  64.         print(v)
  65.     print('-'*30)
  66.     for v in link.revers_iter():
  67.         print(v)
  68.    
  69.          
复制代码

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表