我已经开始在python中学习链表,并且在学习了很多学习链表的材料之后。我发现链表是由节点组成的(每个节点有两个值,即数据和地址),第一个节点被称为HEAD节点,最后一个节点指向None值,显示它是链表的结束。当前一个节点包含下一个节点的地址时,就形成了一个链表。在python中,要实现将一个节点连接到另一个节点,我们只需将一个对象赋值给head变量。下面的代码是一个示例
class Node:
def __init__(self,data):
self.data = data
self.link = None
class SingleLinkedList:
def __init__(self):
self.head = None
def display(self):
if self.head is None:
print("Its a Empty Linked list")
else:
temp = self.head
while temp:
print(temp,"-->"end='')
temp = temp.link
L = SingleLinkedList()
n = Node(10)
L.head = n
n1 = Node(20)
L.head.link = n1
n2 =Node(30)
n1.link = n2
L.display()
我的问题是,在链表中,节点的链接值(也称为引用/地址值)应该包含下一个节点的地址,如何通过第18行(L。头= n)的代码
我的假设是,当我们将一个对象赋值给一个变量(头)时,我们实际上是将该对象的地址赋值给该变量。
我想知道我的假设是正确的还是错误的,如果是错误的,为什么是错误的
有人能解释一下问题中所示的代码流程吗?
Thanks in Advance
当我们将一个对象赋值给一个变量(
head
)时,实际上是将该对象的地址赋值给该变量。我想知道我的假设是对的还是错的,如果是错的,为什么是错的。
对于其他基于指针的语言,比如C,这是正确的,但是Python实际上并没有给你指针,甚至没有给你内存地址。Python有一个抽象层,所有的值都是对象,名字可以引用它们,几个名字可以引用同一个对象。这就是这里真正相关的所有内容,尽管Python为对象提供了标识符(参见id
函数)。
谁能解释一下问题中显示的代码流程?
可以通过使用调试器来分析流,您可以使用该调试器逐步执行代码、设置断点和检查值。下面是发生的事情的粗略概述:
L = SingleLinkedList()
调用SingleLinkedList
类的构造函数:__init__
被执行,它初始化新对象的属性,L
是该对象的名称:
┌────────────┐
L:─┤ head: None │
└────────────┘
下一个语句n = Node(10)
将调用Node
类的构造函数,并使用data
参数作为10的名称。新对象初始化其data
和link
属性,并且n
成为它的名称:
┌────────────┐
L:─┤ head: None │
└────────────┘
┌────────────┐
n:─┤ data: 10 │
│ link: None │
└────────────┘
链接是用赋值:L.head = n
┌────────────┐
L:─┤ head: ─┐ │
└────────│───┘
│
┌────────┴───┐
n:─┤ data: 10 │
│ link: None │
└────────────┘
现在n
名称和L.head
属性都引用了同一个Node
对象。
下一个语句,n2 =Node(30)
创建另一个Node
对象:
┌────────────┐
L:─┤ head: ─┐ │
└────────│───┘
│
┌────────┴───┐ ┌────────────┐
n:─┤ data: 10 │ n2:─┤ data: 30 │
│ link: None │ │ link: None │
└────────────┘ └────────────┘
n1.link = n2
建立链接,改变n1
对象:
┌────────────┐
L:─┤ head: ─┐ │
└────────│───┘
│
┌────────┴───┐ ┌────────────┐
n:─┤ data: 10 │ n2:─┤ data: 30 │
│ link: ────────────┤ link: None │
└────────────┘ └────────────┘
最后一次调用display
,将定义temp
为self.head
(self
为L
):
┌────────────┐
L:─┤ head: ─┐ │
└────────│───┘
temp:─┐ │
┌──────┴─┴───┐ ┌────────────┐
n:─┤ data: 10 │ n2:─┤ data: 30 │
│ link: ────────────┤ link: None │
└────────────┘ └────────────┘
. .在循环中,temp = temp.link
将使temp
引用第二个节点:
┌────────────┐
L:─┤ head: ─┐ │
└────────│───┘
│ temp:─┐
┌────────┴───┐ ┌─────┴──────┐
n:─┤ data: 10 │ n2:─┤ data: 30 │
│ link: ────────────┤ link: None │
└────────────┘ └────────────┘
在最后一次迭代中,temp
将获得值None
,完成对display
的调用。我希望这能澄清问题。
所以链表有这个开始指针的概念,通常被称为头。头部指向链表的第一个节点。所以当你输入
L = SingleLinkedList()
实际上创建了一个头指针仍然为None的链表。
下一步创建一个节点:
n = Node(10)
然后在下一步中,让链表的头指针指向节点n1:
n = Node(10)
L.head = n
继续把n1和n2联系起来:
n2 =Node(30)
n1.link = n2
L.display()
最后是LinkedList。