为什么在 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
那么在SLL
class的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
可以指向 None
或 linked 列表,节点 .
现在,如果是后者,我们不能简单地通过
插入新节点
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
只是一个旁注 - 一开始我发现它有点混乱,我不希望其他人在有这种混乱时忍受这种不适,这就是为什么我的步骤有目的地协作。
希望对您有所帮助:)
我正在 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
class的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
可以指向 None
或 linked 列表,节点 .
现在,如果是后者,我们不能简单地通过
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
只是一个旁注 - 一开始我发现它有点混乱,我不希望其他人在有这种混乱时忍受这种不适,这就是为什么我的步骤有目的地协作。 希望对您有所帮助:)