Python中链表的解释



我已经开始在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的名称。新对象初始化其datalink属性,并且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,将定义tempself.head(selfL):

┌────────────┐
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。

相关内容

  • 没有找到相关文章

最新更新