【问题标题】:Simple linked list ques简单链表队列
【发布时间】:2020-01-05 09:36:24
【问题描述】:

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

在第二个代码中,当我使用 c=a 时,c 和 a 都是对节点 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

【问题讨论】:

  • 在第一个示例中,您将b 设置为None,这不会删除引用的对象,因为在a.next 中还有一个对该对象的引用。在第二个示例中,您实际上没有更改任何内容,因为您将 a.next 设置为 None,默认情况下已经是 None
  • 我已经编辑了code2。请先生回答。
  • 但是现在第一个和第二个例子是一样的..
  • 对不起,先生。
  • 当您创建c=a 时,您传递的不是a 的值,而是对a 的引用。因此,从那里开始,c 将引用与 a 所引用的对象相同的对象。

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


【解决方案1】:

让我用图解表示来解释:

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

希望这能澄清您的疑问。

注意: - 因为 a,b,c 是存储地址的指针。当你执行c.next=None时,c所指向的地址(也被a所指向)的next at address的值变为None。

【讨论】:

  • 嗯,谢谢。我很难理解这一点。我想这是很基本的哈哈
  • 乐于助人!指针在代码中有时会令人困惑,只有当你编写它们时,它们才会变得清晰。
  • 是的.. 有趣的是它与此相似,a=5, b=6, a=b, b=66... Lol
【解决方案2】:

你有一个班级Node。当您创建该类的对象并将其分配给诸如ab 之类的变量时,您正在动态分配足够大的内存以容纳对象的内容,然后分配地址该内存的变量。所以 CODE 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 将在语句 1 中分配的节点的next 属性更新为b,即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 引用相同的属性。

【讨论】:

    【解决方案3】:

    在第一种情况下,您将b 存储在a.next 中,因此在将头节点作为a 迭代链表时,您将遍历所有节点。

    但在第二种情况下,ca 具有相同的引用,而c.nextNone,所以每当您遍历带有c 头部的链表时,您只能到达一个节点。正如while a is not None 条件不允许移动到下一个节点。

    以下代码按预期工作。

    class Node:
        def __init__(self, x):
            self.val = x
            self.next = None
    
    
    a = Node(5)
    b = Node(6)
    c = a
    c.next = b #this line changed
    while a is not None:
        print(a.val)
        a = a.next
    

    【讨论】:

    • 非常感谢朋友
    猜你喜欢
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2017-02-28
    • 2018-03-16
    • 1970-01-01
    • 2011-06-03
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多