繁体   English   中英

__init__ 并在 Python 中创建一个链表

[英]__init__ and create a linked list in Python

我对 Python 很陌生。 虽然我可以在 arrays 中进行一些操作并定义一个新的 function,但这是我第一次使用class__init__ 我正在解决 Python 中的链表问题,并且第一次自己定义一个列表。

我使用的代码如下:

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

LL = LinkedList()
LL.head = Node(3)
print(LL.head.data)

我有几个问题。

  1. 对于 class,我可以将其视为 object 之类的array吗?

  2. def __init__的含义? 我可以将其视为class_var中的操作吗? 例如,对于节点,我们分配两个参数, datanext ,默认值为None ,然后命令Node.dataNode.next将返回结果。 它类似于array.sum()array.len()吗?

  3. Node中我们创建了两个参数,但在LinkedList中,我们不分配任何参数。 但是,在声明中,有self.head = None 它是否创建一个默认值为None的参数head 为什么我们要把它写成

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

这是基本版本。 我发现了另一个高级版本:

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

    def __repr__(self):
        return self.data

class LinkedList:
    def __init__(self):
        self.head = None

    def __repr__(self):
        node = self.head
        nodes = []
        while node is not None:
            nodes.append(node.data)
            node = node.next
        nodes.append("None")
        return " -> ".join(nodes)
  1. __repr__在这里做什么?

  2. ' -> '.join(node)在这里做什么?

对不起,说来话长,但我希望我能找到这里发生的事情。 谢谢你的帮助。

对我来说,这似乎是一个奇怪的链表实现,但我是物理学家,而不是计算机科学家。 我记得,虽然这是实现链表的一种非常标准的方式。 在您显示的代码中,没有“合并”链表 object。 链表 class 只存储头节点,每个节点包含它的数据和链表中下一个节点 object 的名称。 你可以把它想象成一个数组,但一个关键的区别是数组是一个 object ,而链表是链接在一起的单独对象的集合。 这就是为什么我觉得这很奇怪,因为我对存储在一个 object 中的所有数据感觉更舒服,而不仅仅是“自由放养”。 这样做肯定有一些好处,更熟悉 CS 的人可能知道答案。

就您的其他问题而言,__init __init__() function 是您声明新的 object 时调用的 function。 它初始化 object,有点像构造函数。

命令Node.nextarray.sum() ,因为第一个是返回存储在名为next的 class 变量中的数据,第二个是对数组执行操作。

对于第三个问题,我认为LinkedList class 的__init__() function 应该将节点作为参数之一。 此外,在这段代码中:

LL = LinkedList()
LL.head = Node(3)

我不认为这是你应该分配 class 变量的方式。 您应该在初始化时设置头节点(使用__init__() )或创建一个“setter” function 可以修改self.head class 变量并使用该 ZC1C425268E68A385D1AB5074F147。 这段代码就是你想要的:

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

除了它应该是这样的:

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

这使得默认行为self.head = None ,因此如果您声明一个没有头节点的新LinkedList object,则头节点将为空。

__repr__() function 是 function 的表示。 它基本上是一个 function 可以创建 object 的字符串表示形式,除非您必须确定 object 的字符串表示形式。 对于此链表的情况,它将(按顺序)收集节点处的所有数据,然后将它们打印出来。 所以如果我的头节点存储数字5,下一个节点存储数字9,最后一个节点存储数字7,那么将__repr__() function应用到头节点将返回字符串

5 -> 9 -> 7

' -> '.join(node)获取节点数组中的所有项目并将它们打印为字符串,字符串->分隔每个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM