开发者社区> 问答> 正文

为Python在链表中有效地在尾部插入节点

我试图实现一个单链表插入和删除双方在O(1)的时间。为了做到这一点,我将一个指针保存到头部和尾部。 我遇到的麻烦是insert_tail方法。这是我的伪代码:

If there is no head or tail,
    Set the head AND tail to the new Node
Otherwise,
    Insert the new node as a child of the tail
    Set the tail to that new node

这是我的Python 3代码:

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

    def __str__(self):
        if self.next:
            return "{} -> {}".format(self.val, self.next.val)
        else:
            return "{}".format(self.val)


class LinkedList():
    def __init__(self, init):
        self.head = Node(init)
        self.tail = Node(init)

    # Search at O(n)
    def search(self, val) -> Node:
        pass

    # Insert head or tail at O(1). Returns new node.
    def insert_head(self, val) -> None:
        inserting = Node(val)
        inserting.next = self.head

        self.head = inserting

        # Inserting to empty case
        if self.tail == None:
            self.head = inserting
            self.tail = inserting

        return self.head

    def insert_tail(self, val) -> None:
        inserting = Node(val)

        # Inserting to empty case
        if self.head == None and self.tail == None:
            self.head = inserting
            self.tail = inserting

        else:
            # Change the value of the tail
            self.tail.next = inserting
            self.tail = self.tail.next

    # Insert average case O(n) + 1
    def insert(self, val) -> Node:
        pass

    # Delete at O(1).
    def delete(self, val) -> None:
        pass

    def __str__(self):
        return str(list(self))

    def __iter__(self):
        node = self.head
        while node:
            yield node.val

            node = node.next


# 14, 12, 11, 19, 17, 16, 30, 18, 22, 21, 24, 23, 15
linked = LinkedList(30)

linked.insert_head(16)
linked.insert_head(17)
linked.insert_head(19)
linked.insert_head(11)
linked.insert_head(12)
linked.insert_head(14)
print(linked)

linked.insert_tail(18)
linked.insert_tail(22)
linked.insert_tail(21)
linked.insert_tail(24)
linked.insert_tail(23)
linked.insert_tail(15)
print(linked) # Should actually be: [14, 12, 11, 19, 17, 16, 30, 18, 22, 21, 24, 23, 15]
# But instead it printsas if a new tail was never inserted: [14, 12, 11, 19, 17, 16, 30]

问题来源StackOverflow 地址:/questions/59384136/inserting-node-at-tail-efficiently-in-linked-list-for-python

展开
收起
kun坤 2019-12-26 15:39:19 351 0
1 条回答
写回答
取消 提交回答
  • 要在O(1)时间内对两边进行删除,需要一个双链表;否则,在删除后查找新尾需要从头遍历。

    2019-12-26 15:39:26
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载