下面是一个简单的链表程序,我知道链表在概念上是如何工作的(添加、删除等(,但我发现很难从面向对象设计的角度理解它是如何工作的。
法典:
class Node():
def __init__(self,d,n=None):
self.data = d
self.next_node = n
def get_next(self):
return self.next_node
def set_next(self,n):
self.next_node = n
def get_data(self):
return self.data
def set_data(self,d):
self.data = d
class LinkedList():
def __init__(self,r = None):
self.root = r
self.size = 0
def get_size(self):
return self.size
def add(self,d):
new_node = Node(d,self.root)
self.root = new_node
self.size += 1
def get_list(self):
new_pointer = self.root
while new_pointer:
print new_pointer.get_data()
new_pointer = new_pointer.get_next()
def remove(self,d):
this_node = self.root
prev_node = None
while this_node:
if this_node.get_data() == d:
if prev_node:
prev_node.set_next(this_node.get_next())
else:
self.root = this_node
self.size -= 1
return True
else:
prev_node = this_node
this_node = this_node.get_next()
return False
def find(self,d):
this_node = self.root
while this_node:
if this_node.get_data() == d:
return d
else:
this_node = this_node.get_next()
return None
myList = LinkedList()
myList.add(5)
myList.add(8)
myList.add(12)
myList.get_list()
我这里有几个问题..
它如何存储值。据我了解,每个变量都可以保存一个值。那么数据/next_node如何保存多个值。next_node是否保存下一个节点的内存位置?
new_pointer.get_data()
new_pointer如何访问get_data((?我们不需要有一个实例来访问 Node 的方法吗?
这个问题可能很愚蠢,但我对面向对象编程很陌生。如果有人可以回答这些问题或发布解决这些问题的外部链接,那将非常有帮助。
提前谢谢。
-
next_node
是Node
的一个实例,因此它有自己的data
字段。next_node
是对节点对象的引用,它是一些内存地址(但它不是类似 C 的指针,因为您不需要取消引用它或任何东西(。 -
我假设你在谈论
get_list()
. new_pointer是Node
的一个实例。 (除非是None
,在这种情况下,您将永远不会进入get_data()
通话(。 执行add
时,创建此Node
实例并为其设置root
。 然后在get_list
中将new_pointer
设置为root
.
myList.root
只存储一个值,该值是列表的根。最初查看何时执行以下操作:
myList = LinkedList()
在内存myList.root = None
中(根据LinkedList
__init__
(。现在:
myList.add(1)
那么这个语句被称为:
new_node = Node(d,self.root) #Note here self.root = None
然后: def init(self,d,n=None(: 自我数据 = d self.next_node = n
所以我们的清单是:1--> None
。现在:
myList.add(2)
然后,这句话又被称为:
new_node = Node(d,self.root) #Note here self.root has some value
现在,将创建一个新的节点对象,并将其下一个对象分配给myList.root
。所以我们的列表变成了:2-->1--> None
以类似的方式分配整个列表。这里要注意的关键是myList.root始终存储最顶层的节点,而该节点又保存下一个节点,依此类推。
对于你的第二个问题,从上面的解释中可以清楚地看出,类node
的对象总是可供myList.root
使用,而又有next_node
又是"节点"的对象。因此,他们都可以访问"get_data(("方法。