为什么在 SLL 中其原始节点属性默认将其设置为 None 时,我们显式覆盖指向 None 的下一个指针?

Why do we explicitly overwrite the next pointer to None when its original node attribute sets it to None by default in SLL?

我正在 python 中选取链表。基本上,我正在编写用于在链表 的前面添加节点 的逻辑。 但是,我的老师做的有点不同,所以我需要理解为什么需要下面这行。

这里是完整的代码供参考

#Singly linked list in Python3
class SLLNode:
    def __init__(self, data):
        self.data = data
        self.next = None

    def __repr__(self): 
        return "SLLNode object data = {}".format(self.data)

    def get_data(self):
        return self.data


    def set_data(self, new_data):
        self.data= new_data


    def get_next(self):
        return self.next


    def set_next(self, new_next):
        self.next= new_next

#Singly Linked List class
class SLL:
    def __init__(self):
        self.head= None

    def __repr__(self):
        return "SLL object head: {}".format(self.head)

    def isempty(self): 
        return self.head is None 

    def add_front(self, new_data):
        temp = SLLNode(new_data)
        temp.set_next(self.head)  # Why do we need this line?
        self.head= temp

那么在SLLclass的add_front方法中,为什么要通过设置set_next=None这样

 temp = SLLNode(new_data)
 temp.set_next(self.head)  
 self.head= temp

当我看到下一个指针在 SLLNode class.And 中默认设置为 None 时,我这样做并获得相同的输出。

 temp = SLLNode(new_data)
 self.head= temp

是不是我这里遗漏了什么老师没有解释的情况?或者我的程序没有那条额外的行也能正常工作?

如果您只调用 add_front 一次,您的观察是正确的。

但是第二次调用add_front时,self.head不再是None,而是指向之前的head

想象一下,这就是您第一次调用 add_front 时发生的情况:

Before: None
After: A -> None

您创建一个新节点(我们称之为 A)并使其指向前一个头部,即 None。但是第二次出现这种情况:

Before: A -> None
After: B -> A -> None

我们创建另一个节点(B),并使其指向前一个头部。不过现在之前的人头不再是None,而是A!

虽然我理解并接受 orlp 的回答,但我想通过将其分解成一个更简单的句子来澄清它。

基本上,我们的 self.head 可以指向 Nonelinked 列表,节点 . 现在,如果是后者,我们不能简单地通过

插入新节点
temp = SLLNode(new_data)
self.head= temp

这基本上是创建一个包含值的节点,并使 self.head 指向它。但是在这样做的同时,我们将 link 断开到另一个已经存在的 linked 列表链,我们的 self.head 之前指向该列表。

所以系统地总结一下,

第 1 步: 我们初始化我们的新/temp 节点。

temp=SLLNode(new_data)

这里我们只是创建一个节点并用一个值初始化它。此时 self.next 指针将是 None。

第 2 步: 我们将新初始化的节点指向 self.head 当前指向的相同位置.(它可能指向 None 或一个节点。因此,如果 None 是这种情况,那么我注释掉 temp.set_next(self.head) 的逻辑有效,但如果它指向一个节点,那么我的逻辑会破坏与现有链的连接和 self.Head 现在仅指向 temp/ 新创建的节点,这是错误的,因为这样做我们已经断开了与现有链的连接。这就是我们执行以下操作的原因code.It 确保我新创建的节点/temp 也指向 self.head 所在的相同位置,所以现在即使我们断开 self.head 的连接,我们也有我们的linked 列表链安全。)

temp.set_next(self.head)

第 3 步: 现在我们只需将 self.head 指向 temp/新创建的指针,这样我们就有了一个完整的链。

self.head= temp

只是一个旁注 - 一开始我发现它有点混乱,我不希望其他人在有这种混乱时忍受这种不适,这就是为什么我的步骤有目的地协作。 希望对您有所帮助:)