需要帮助了解python简单链表程序



下面是一个简单的链表程序,我知道链表在概念上是如何工作的(添加、删除等(,但我发现很难从面向对象设计的角度理解它是如何工作的。

法典:

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() 

我这里有几个问题..

  1. 它如何存储值。据我了解,每个变量都可以保存一个值。那么数据/next_node如何保存多个值。next_node是否保存下一个节点的内存位置?

  2. new_pointer.get_data() new_pointer如何访问get_data((?我们不需要有一个实例来访问 Node 的方法吗?

这个问题可能很愚蠢,但我对面向对象编程很陌生。如果有人可以回答这些问题或发布解决这些问题的外部链接,那将非常有帮助。

提前谢谢。

  1. next_nodeNode的一个实例,因此它有自己的data字段。 next_node是对节点对象的引用,它是一些内存地址(但它不是类似 C 的指针,因为您不需要取消引用它或任何东西(。

  2. 我假设你在谈论get_list(). new_pointerNode的一个实例。 (除非是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(("方法。

相关内容

  • 没有找到相关文章

最新更新