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