简单的链表问题

时间:2019-09-02 10:32:15

标签: python python-3.x algorithm data-structures linked-list

因此,在第一个代码中,我正在制作a.next = b。这意味着a.next和b都充当对Node6的引用。所以当我使b = None时。为什么a.next仍然指向Node6,

在第二个代码中,当我使c = a初始化时,c和a都是对Node 5的引用。现在,我使c.next = None消失,但是此更改也反映到了a上。甚至a.next也变成了None。

这两个代码都是相同的步骤,为什么更改仅反映在代码2中?

class Node:

     def __init__(self, x):
         self.val = x
         self.next = None

a=Node(5)
b=Node(6)
a.next=b
b=None
while a is not None:
    print(a.val)
    a=a.next

代码2

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

a=Node(5)
b=Node(6)
a.next=b
c=a
c.next=None
while a is not None:
    print(a.val)
    a=a.next

3 个答案:

答案 0 :(得分:3)

让我用图解说明来解释: enter image description here

在情况1中:列表a在链接列表中有两个节点5和6。 但是在情况2中:列表ac在链接列表中有一个节点5。 b指向另一个链表,该链表只有6个。

希望这可以澄清您的疑问。

注意: -由于a,b,c是存储地址的指针。当您执行c.next=None时,由c指向的地址(也由a指向)的next值变成None。

答案 1 :(得分:1)

您有一个课程Node。创建该类的对象并将其分配给变量ab时,您将动态分配足够大的内存以容纳该对象的内容,然后分配地址内存中的变量。因此,代码1 确实看起来更像:

addr1 = storage address for Node(5) // Statement 1
a = addr1 // Statement 2
addr2 = storage address for Node(6) // Statement 3
b = addr2 // Statement 4
a.next = b // Statement 5
b = None // Statement 6

语句5正在使用next的值b更新语句1中分配的节点的addr2属性。在语句6中,我们为b分配了一个新值,但这不会更改存储到a所引用的实际对象中的值。考虑下面的整数示例:

x = 5
y = 7
x = y
y = 0

设置y = 0不会影响x = y的先前赋值,即x仍将具有y的先前值7。您的示例的唯一区别是我们不是在处理整数,而是地址。

现在,我们感谢ab确实是指向保存实际对象的内存位置(即地址)的引用,当您说c=a时,c和a都现在引用相同的对象,可以互换使用。因此,c.nexta.next引用相同的属性。

答案 2 :(得分:0)

在第一种情况下,您将b存储在a.next中,因此在循环链接列表和头节点为a的同时遍历所有节点。

但是在第二种情况下,ca具有相同的引用,并且c.nextNone,因此无论何时遍历链接头为{{1}的链表}您只能到达一个节点。由于c条件不允许移动到下一个节点。

以下代码可以正常工作。

while a is not None