【问题标题】:Understanding a Linked List implementation in Python了解 Python 中的链表实现
【发布时间】:2018-02-19 22:43:57
【问题描述】:

我在网上找到了一个用 Python 实现的链表,但它没有任何解释或 cmets。

我了解链表的基本概念,但代码中有一个关键部分我不明白:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next

    def set_data(self, data):
        self.data = data

    def set_next(self, next):
        self.next = next

class LinkedList:
    def __init__(self):
        self.head = None

    def is_empty(self):
        return self.head == None

    def add(self, item):
        temp = Node(item)
        temp.set_next(self.head)
        self.head = temp

    def size(self):
        current = self.head
        count = 0

        while current != None:
            count += 1
            current = current.get_next()

        return count

    def search(self, item):
        current  = self.head

        while current != None:
            if current.get_data() == item:
                return True
            else:
                current = current.get_next()

        return False

    def remove(self, item):
        current = self.head
        previous = None
        found = False

        while not found:
            if current.get_data() == item:
                found = True
            else:
                previous = current
                current = current.get_next()

        if previous == None:
            self.head = current.get_next()
        else:
            previous.set_next(current.get_next())

我不明白LinkedList 类中的sizesearchremove 方法在设置为self.head,似乎包含在LinkedList 类的范围内。

是不是因为add方法设置了self.head = temp,其中temp是一个Node对象?

如果可能,有人能解释一下这是如何工作的吗?

【问题讨论】:

  • 是的。 current 设置为 self.head,这是一个 Node 对象(随后,设置为 other Node 对象),它具有这些方法。如果您使用current = my_list; current.append(something),它的工作方式与使用list 对象方法完全相同
  • 基本上,您在LinkedList 中存储对第一个Node 对象的引用,然后您可以从那里访问其方法,从而实现从Node 到Node 的导航过程。

标签: python python-3.x oop linked-list


【解决方案1】:

你说过:

我不明白 LinkedList 类中的 size、search 和 remove 方法如何能够通过当前变量从 Node 类调用函数,在将其设置为 self.head 后,似乎包含在范围内LinkedList 类的。

在代码中可以看到,初始化一个LinkedList执行了这行代码:

self.head = None

由于 head 设置为 none,因此 size、search 和 remove 方法将不会贯穿整个代码。相反,它会在 self.head == None 时停止,这几乎是在开始。

例如,我们来看看size方法。

def size(self):

    current = self.head
    count = 0

    while current != None:
        count += 1
        current = current.get_next()

    return count

在此函数中,current 设置为 self.head,除非您通过调用 add() 方法添加了任何节点,否则它为 null。稍后会详细介绍。

count 设置为 0。然后开始一个 while 循环,该循环仅在当前不是 None 时运行。但是由于 current 设置为 self.head,即 None,while 循环将不会运行,函数将返回 count 为 0。这是一个正确的实现,因为链表中当前没有节点。

现在介绍如何添加节点。

添加方法:

    def add(self, item):
        temp = Node(item)
        temp.set_next(self.head)
        self.head = temp

这里,add 方法接受自身和一个项目。该项目是某种类型的对象,无论它是字符串、整数、浮点数等。现在创建了一个变量 temp 并将其设置为一个 新节点,该节点最终使用了 Node 类中的某些内容。然后,将temp的下一个节点设置为head,并将head设置为temp。这样做的作用是链表不断更新头部。

像这样:

(头) 节点1

再添加一个节点

(头) 节点2节点1

等等……

编码愉快!

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2014-03-07
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多