【问题标题】:Need help understanding python simple linked list program需要帮助理解python简单链表程序
【发布时间】:2015-06-29 04:54:58
【问题描述】:

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

代码:

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. 如何存储这些值。据我了解,每个变量都可以保存一个值。那么 data/next_node 是如何保存多个值的。 next_node 是否保存下一个节点的内存位置?

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

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

提前致谢。

【问题讨论】:

  • 有很多话要说。学习 Python,有很多很好的资源可用。

标签: python oop linked-list


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

  2. 我假设您说的是get_list()。 new_pointer Node 的一个实例。 (除非它是None,在这种情况下你永远不会进入get_data() 电话)。当您执行add 时,您将创建此Node 实例并将root 设置为它。然后在get_list 中将new_pointer 设置为root

【讨论】:

  • next_nodeNode 类的实例吗?它不是Node 类中的变量吗,我知道new_node 是Node 的实例,因为new_node = Node(d,self.root)
  • 当你有一个至少有一个节点的 LinkedList 并且你 add() 一个新节点时,你会使用对根的引用来构造这个新节点。注意在Node__init__()中,旧根(指向某个节点)成为新节点的下一个,然后将新根设置到这个新节点。
【解决方案2】:

myList.root 只存储一个值,它是列表的根。开始时查看:

myList = LinkedList()

在内存中myList.root = None(根据__init__LinkedList)。现在:

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.Now:

myList.add(2)

然后再次调用此语句:

new_node = Node(d,self.root)        #Note here self.root has some value

现在一个新的节点对象被创建并且它的下一个被分配给myList.root。 所以我们的列表变成了:2-->1--> None 以类似的方式分配整个列表。 这里要注意的关键是 myList.root 始终存储最顶部的节点,该节点又包含下一个节点,依此类推。

对于您的第二个问题,从上面的解释中可以清楚地看出,myList.root 始终可以使用node 类的对象,而next_node 又是“节点”的对象。所以他们都可以访问 'get_data()' 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多