【问题标题】:Why do we create a different class for head node in linked list?为什么我们要为链表中的头节点创建一个不同的类?
【发布时间】:2020-09-05 12:47:07
【问题描述】:

我是数据结构的新手,刚开始接触链表。我理解整个代码,但我无法理解为什么 llist.head 是类 Linkedlist 的属性,它成为类 Node 的对象。在后面的示例中,我们为什么要执行此分配 llist.head = node(1)

class Node: 
  
    def __init__(self, data): 
        self.data = data
        self.next = None
  
class LinkedList: 
  
    def __init__(self): 
        self.head = None

    if __name__=='__main__': 
      
        llist = LinkedList() 
      
        llist.head = Node(1) 
        second = Node(2) 
        third = Node(3) 
      
        llist.head.next = second
        second.next = third 

【问题讨论】:

  • LinkedList 表示列表本身和列表的节点一节点(元素)。我们需要将列表的头节点存储在某处,以跟踪列表的开始位置,为此我们使用 LinkedList 的 head 属性。
  • 谢谢!! @Óscar López
  • LinkedList 是您定义添加或删除新节点、计算列表或迭代列表的方法的地方。这样,您可以编写llist.append(1)llist.append(2) 等,而无需自己管理指针。

标签: python oop data-structures linked-list


【解决方案1】:

你有一个代表节点的类和一个代表列表的类。

但是你也可以认为每个节点代表一个(子)列表的起点。因此,如果它更适合您,您可以取消代表列表的类:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

if __name__ == '__main__':
    head = Node(1)
    second = Node(2)
    third = Node(3)

    head.next = second
    second.next = third

【讨论】:

    【解决方案2】:

    将其他对象作为类的属性是很常见的!
    (特别是在 Python 中,将类的 所有 属性视为对象是有意义的。数字可能是 Integer 对象,名称可能是 String 对象……而 LinkedList 具有 Node 对象。这里唯一的区别是您自己创建了类,而不是使用内置类!)

    对 Node 和 LinkedList 使用单独的类在 面向对象 方法中很有意义。它们是非常不同的事物,具有某种相关性,例如,例如公交线路和公交车站。公交线路有第一站、第二站和第三站等。站点本身有上一站和下一站。

    顺便说一句:LinkedList 的部分优点在于您不必为每个节点命名。您只需要知道它从哪里开始 - 从那里开始,您只需跟随单个节点的 next 元素即可一直通过列表。

    【讨论】:

    • 很高兴听到这个消息!如果您觉得我的回答有用,请考虑点赞。
    【解决方案3】:

    我也有同样的问题,但不太相信。所以,我做了一些研究,找到了这个问题的准确答案,为什么我们还要为 Node 和 head 创建一个不同的类,即为什么我们在 Linked List 实现中使用两个类? 这些都是我的所有问题,他们都有一个答案:

    假设我们只使用 Node 类,即头节点没有单独的类。我们总是通过对头节点的引用来访问链表。如果多个对象需要对链表的引用,然后链表的头部发生变化怎么办?一些对象可能仍指向旧头。我们会怎么做 ? ?。解决这个问题的方法是引入包含头节点的 LinkedList 类,即保存头节点的初始值。所以我们应该实现一个包装了 Node 类的 LinkedList 类。

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多