Python链表:盒子里的猫

你好! 期待Python开发人员课程的开始,我们已经为您准备了Python链表上的一小篇作者材料。



Python是一种非常方便且多方面的语言,但是默认情况下,它没有像链表或LinkedList这样的数据结构。 今天,我将分享有关该主题的最佳实践,并讨论一下此数据结构是什么。 那些第一次接触链表主题​​并想从算法的角度理解它们的工作原理的人将对本文感兴趣。



什么是LinkedList?


LinkedList或链表是一种数据结构。 链表提供了从任何元素创建双向队列的能力。 这样的列表的每个元素都被视为一个节点。 实际上,一个节点具有其值,以及到先前节点和后续节点的两个链接。 也就是说,列表由有助于上移或下移列表的节点“链接”。 由于这些结构特性,您可以从链表中组织堆栈,队列或双队列。

让我们可视化干燥的定义。 现在我们有猫坐在箱子里了。 在每个盒子上都写着它的顺序和含义。



我们将如何处理链表:

  1. 检查其中是否包含此元素;
  2. 在最后添加节点;
  3. 通过索引获取节点的值;
  4. 删除节点。

实际上,还有更多选择可以使用它们,但是我们将详细介绍这些基本步骤的实现。 了解了它们的构建原理后,您自己就可以轻松实现自己的方法。

您必须先创建两个类:

class Box: def __init__ (self,cat = None): self.cat = cat self.nextcat = None class LinkedList: def __init__(self): self.head = None 

在一般情况下,我们有一个内部具有某些值的节点-猫和指向下一个节点的链接。 也就是说,分别在Box类中,有一只猫和一个指向下一个盒子的链接。 像任何清单一样,连贯也有一个起点,即头脑。 由于最初没有任何内容,因此起始元素设置为“无”。

是列表中的项目




让我们从一个简单的开始。 要检查串联的盒子中是否有特定的猫,您需要循环浏览整个列表,并用列表中元素的值检查现有值。

 def contains (self, cat): lastbox = self.head while (lastbox): if cat == lastbox.cat: return True else: lastbox = lastbox.nextcat return False 

将节点添加到列表末尾




首先,您需要创建一个新盒子,并且已经在其中放了一只新猫。 之后,您需要从链表的开头开始检查当前节点中是否有指向下一个节点的链接,如果存在则转到该链接,否则该节点是最后一个节点,因此您需要创建一个指向下一个节点的链接并在其中放置一个新框。我们创建的。

  def addToEnd(self, newcat): newbox = Box(newcat) if self.head is None: self.head = newbox return lastbox = self.head while (lastbox.nextcat): lastbox = lastbox.nextcat lastbox.nextcat = newbox 

通过索引获取节点




通过索引catIndex,我们希望获得一个盒形节点,但是由于没有为此类节点提供索引,因此我们需要提出某种替代方法,即将一个变量用作索引。 此变量是boxIndex。 我们遍历整个列表并检查节点的“序列号”,如果它与所需的索引匹配,我们将得出结果。

  def get(self, catIndex): lastbox = self.head boxIndex = 0 while boxIndex <= catIndex: if boxIndex == catIndex: return lastbox.cat boxIndex = boxIndex + 1 lastbox = lastbox.nextcat 

删除节点




在这里,我们考虑的不是按索引而是按值删除元素,以便引入至少某种变化。

搜索从列表的开头开始,即从一行中的第一个框开始,然后继续搜索,直到框用完,即直到标题变成None。 我们检查当前节点中存储的值是否与我们要删除的值匹配。 如果没有,那么我们继续前进。 但是,如果匹配,则将其删除并“重新链接”链接,即删除第N个框,而N-1框现在指的是N + 1框。

  def removeBox(self,rmcat): headcat = self.head if headcat is not None: if headcat.cat==rmcat: self.head = headcat.nextcat headcat = None return while headcat is not None: if headcat.cat==rmcat: break lastcat = headcat headcat = headcat.nextcat if headcat == None: return lastcat.nextcat = headcat.nextcat headcat = None 

就这样,感谢您阅读本文! 实际上,LinkedList结构并不复杂,从内部了解其工作方式非常重要。 当然,在Python中,它可以用lambda表达式实现,它所占用的空间要少得多,但是在这里,我的目的是尽可能详细地解释其结构以及在Python中的操作原理,而不是追求优化。

源代码可以在这里找到

Source: https://habr.com/ru/post/zh-CN470828/


All Articles