了解Python中的链接列表实现

时间:2018-02-19 22:43:58

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

我在Python中找到了一个Python链接列表的实现,但它没有任何解释或注释。

我理解链接列表的基本概念,但是我不理解的代码中有一个关键部分:

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

我不明白size类中的searchremoveLinkedList方法如何能够通过Node类调用函数current变量在设置为self.head之后,似乎包含在LinkedList类的范围内。

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

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

1 个答案:

答案 0 :(得分:0)

你说过:

  

我不知道LinkedList类中的大小,搜索和删除方法如何能够通过当前变量调用Node类中的函数,然后将其设置为self.head,这似乎包含在LinkedList类的范围。

您可以在代码中看到,初始化LinkedList会执行以下代码行:

self.head = None

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

例如,让我们来看看尺寸方法。

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时运行。但由于当前设置为self.head为None,因此while循环不会运行,函数将返回0的计数。这是一个正确的实现,因为链表中当前没有节点。

现在了解如何添加节点。

添加方法:

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

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

像这样:

(头) NODE1

添加更多节点

(头) NODE2 NODE1

等等......

快乐的编码!