我是一名新手python程序员。我在下面看到了leetcode对链接列表的定义。我对这个概念有两个问题,如果有任何帮助,我将不胜感激。提前感谢
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
Q1只是想知道"self.next"的类型是什么,我知道在C++中,它应该是一个表示下一个节点地址的指针。但是python没有那个类型,所以我很困惑"下一个"是什么类型
Q2有些人告诉我下一个只是一个名字。如果是这样的话,我运行下面的代码,
head =ListNode(1)
print sys.getsizeof(head)
head.next = ListNode(2)
print sys.getsizeof(head)
首先head.next为"None",然后将其分配给另一个ListNode类型,但在这次更改前后,我得到了相同大小的头,我认为头的大小应该更大,因为它的一个成员(next(从None类型更改为ListNode类型。我只是对此感到困惑,非常感谢!
PS。在我的理解中,如果我不断地向链接列表中添加新节点,那么头会越来越大,因为"下一个"的"嵌套"成员越来越多,只需指出我错在哪里,谢谢。
问题1:
Python变量是动态类型化的。(即,一个变量可以包含一个int,然后包含一个list,然后包含任何其他任意对象,等等(。
在您的情况下,Head.next
通过引用None
一个NoneType
对象开始。
为其指定不同的值(ListNode(2)
(后,Head.next
现在将引用新创建的ListNode
对象。
问题2:
为什么尺寸不变。我不是python的sys.getsizeof
如何工作的专家,但据我所知,List.next在这两种情况下都是引用变量(即引用其他对象的变量(。大小不会改变,因为sys.getsizeof
会查找对象变量的大小。其中Head.next
在这两种情况下都只是对某个其他对象的引用。
请参阅,如何在Python中确定对象的大小?,以获得关于CCD_ 10如何工作的更完整答案。
我对链表的解释。
class LinkedList(object):
class Node(object):
def __init__(self, val=None, next=None, previous=None):
self.val = val
self.next = next
self.last = previous
def __init__(self):
self.length = 0
self.start = None
self.end = None
def append(self, value):
self.length += 1
if not self.start:
self.start = self.Node(value)
else:
if not self.end:
self.end = self.Node(value)
self.end.previous = self.start
self.end.next = self.start
self.start.next = self.end
else:
end = self.Node(value)
self.end.next = end
end.previous = self.end
self.end = end
self.end.next = self.start
def prepend(self, value):
self.length += 1
if not self.start:
self.start = self.Node(value)
else:
n = self.Node(value, self.start, self.end)
self.start.previous = n
self.start = n
def __len__(self):
return self.length
def __iter__(self):
self.position = 0
return self
def next(self):
self.position += 1
if self.position-1 >= len(self):
raise StopIteration
if self.position-1 == 0:
return self.start
cnt = 0
n = self.start
while cnt<self.position-1:
n = n.next
cnt += 1
return n
def __getitem__(self, index):
if index == 0:
return self.start
if index == -1:
return self.end
cnt = 0
n = self.start
while cnt<index+1:
n = n.next
cnt += 1
return n.val
def __repr__(self):
return repr(tuple(x.val for x in self))
l = LinkedList()
l.append(4)
l.append(5)
l.append(3)
l.prepend(0)
print l
print l[1]