如何将项目添加到链接列表的末尾?

时间:2016-10-22 13:04:56

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

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

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

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

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

我试过这样做,但它没有用。

from LinkedList import Node, LinkedList

def insert_at_end(linked_list, item):
    linked_list.add(item)

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

您需要遍历链接列表并在最后添加新节点:

def insert_at_end(linked_list, item):
    if linked_list.is_empty():
        linked_list.add(item)
    else:
        node = linked_list.head
        while node.next is not None:
            node = node.next
        node.next = Node(item, None)

如果链表为空,则重新使用现有方法在一开始添加节点。

演示:

>>> def print_ll(ll):  # something to print the list
...     node = ll.head
...     while node is not None:
...         print node.item,
...         node = node.next
...
>>> linked_list = LinkedList()
>>> insert_at_end(linked_list, 10)
>>> insert_at_end(linked_list, 42)
>>> insert_at_end(linked_list, 'foo')
>>> print_ll(linked_list)
10 42 foo

答案 1 :(得分:0)

一个选项是将__iter__()魔术方法添加到您的LinkedList中以使其可迭代:

    def __iter__(self):
        current = self.head
        while current is not None:
            yield current
            current = current.next
        else:
            raise StopIteration

现在你可以迭代遍历节点添加到尾部:

    def add_tail(self, item):
        if self.is_empty():
            self.add(item)
            return

        # Loop to the end of the list and add the item at the end.
        for node in self:
            pass
        else:
            node.next = Node(item, node.next)

添加__iter__()魔术方法还有一个好处,就是可以使用迭代来构建链表的字符串表示。通过定义__str__()魔术方法,您可以使用print(my_list)打印类似2->3->5的内容,如果您有__iter__(),则可以很容易地使用列表解析方法定义。

请注意,这实际上与the answer given by @MartijnPieters相同,只是它的形式不同。你仍然在列表中循环,直到你到达最后并在最后添加项目。