下面是一个简单的链表程序,我知道链接列表在概念上是如何工作的(添加,删除等),但我发现很难从面向对象的设计角度理解它是如何工作的。
代码:
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()
我在这里有几个问题..
如何存储值。据我所知,每个变量都可以包含一个值。那么data / next_node如何保存多个值。 next_node是否保存下一个节点的内存位置?
new_pointer.get_data()
new_pointer如何访问get_data()?我们不需要有一个实例来访问Node的方法吗?
这个问题可能很愚蠢,但我对面向对象编程很陌生。如果有人可以回答这些问题或发布解决这些问题的外部链接,那将非常有帮助。
提前致谢。
答案 0 :(得分:1)
next_node
是Node
的一个实例,因此它有自己的data
字段。 next_node
是对节点对象的引用,它是一些内存地址(但它不是类似C的指针,因为你不需要取消引用它或任何东西)。
我假设你在谈论get_list()
。 new_pointer 是 Node
的实例。 (除非它是None
,在这种情况下你永远不会进入get_data()
电话。当您执行add
时,您可以创建此Node
的实例,并为其设置root
。然后在get_list
中,您将new_pointer
设置为root
。
答案 1 :(得分:0)
myList.root
仅存储一个值,即列表的根。最初看到的时间:
myList = LinkedList()
内存myList.root = None
中的(根据__init__
的{{1}})。现在:
LinkedList
然后调用此语句:
myList.add(1)
然后:
def init (self,d,n = None):
self.data = d
self.next_node = n
所以我们的列表是:new_node = Node(d,self.root) #Note here self.root = None
。现在:
1--> None
然后再次声明这句话:
myList.add(2)
现在创建一个新的节点对象,并将其下一个对象分配给new_node = Node(d,self.root) #Note here self.root has some value
。
所以我们的列表变为:myList.root
以类似的方式进行整个列表的分配。
这里要注意的关键是myList.root总是存储最顶层的节点,而后者又保存下一个节点,依此类推。
对于你的第二个问题,从上面的解释中可以清楚地看出,2-->1--> None
总是可以使用node
类的对象,而myList.root
又有next_node
,这又是'{1}}的对象。节点'。所以他们都可以访问'get_data()'方法。