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



我正在用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

那么在SLL类的add_front方法中,为什么我们需要通过这样做来经历设置set_next=None

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

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

temp = SLLNode(new_data)
self.head= temp

是不是我在这里遗漏了什么情况,我的老师没有解释?或者我的程序在没有额外行的情况下会做得很好?

如果你只给add_front打电话一次,你的观察是正确的。

但是第二次叫add_frontself.head就不再None了,居然指向了之前的头。

为了可视化,这是您第一次调用add_front时发生的情况:

Before: None
After: A -> None

你创建一个新节点(我们称之为 A(并使其指向前一个头,即 None。但第二次发生这种情况时:

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

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

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

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

temp = SLLNode(new_data)
self.head= temp

这基本上是创建一个带有值的节点,并使self.head指向它。但是在这样做的时候,我们断开了与self.head之前指向的已经存在的链表的另一个链的链接。

所以系统总结一下,

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

temp=SLLNode(new_data)

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

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

temp.set_next(self.head)

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

self.head= temp

只是一个旁注- 我一开始发现它有点令人困惑,我不希望其他人在遇到这种困惑时承受这种不适,这就是为什么我的步骤是有目的地协作的原因。 希望对:)有所帮助

相关内容

  • 没有找到相关文章