在恒定时间内将节点插入链表?

时间:2008-11-16 19:05:28

标签: java linked-list

我正在进行一项任务,告诉我假设我有一个带有标题和尾节点的单链表。它要我在位置p之前插入一个项目y。任何人都可以查看我的代码并告诉我,我是否在正确的轨道上?如果没有,你可以向我提供任何提示或指示(没有双关语)?

tmp = new Node();
tmp.element = p.element;
tmp.next = p.next;
p.element = y;
p.next = tmp;

我想我可能错了,因为我根本没有使用头部和尾部节点,即使在问题描述中特别提到它们。我正在考虑编写一个while循环来遍历列表,直到它找到p并解决问题,但这不会是恒定时间,是吗?

7 个答案:

答案 0 :(得分:5)

如果你遇到一个算法,请写下来:

// First we have a pointer to a node containing element (elm) 
// with possible a next element.
// Graphically drawn as:
// p -> [elm] -> ???

tmp = new Node();
// A new node is created. Variable tmp points to the new node which 
// currently has no value.
// p   -> [elm] -> ???
// tmp -> [?]

tmp.element = p.element;

// The new node now has the same element as the original.
// p   -> [elm] -> ???
// tmp -> [elm]

tmp.next = p.next;

// The new node now has the same next node as the original.
// p   -> [elm] -> ???
// tmp -> [elm] -> ???

p.element = y;

// The original node now contains the element y.
// p   -> [y] -> ???
// tmp -> [elm] -> ???

p.next = tmp;

// The new node is now the next node from the following.
// p   -> [y] -> [elm] -> ???
// tmp -> [elm] -> ???

你有所需的效果,但它可以更有效率,我打赌你现在可以找到自己。

写下类似的内容更为清楚:

tmp = new Node();
tmp.element = y;
tmp.next = p;
p = tmp;

如果p不可变,那当然不起作用。但是如果p == NULL,则算法会失败。

但我想说的是,如果你遇到算法问题,只需写出效果即可。特别是对于树木和链接列表,你需要确保所有指针都指向正方向,否则你会变得很乱。

答案 1 :(得分:4)

提示:当位置 n = 0或列表的头部时,插入链接列表只是常量。否则,最坏情况的复杂性是 O(n)。这并不是说您无法创建一个合理有效的算法,但它始终具有至少线性复杂度。

答案 2 :(得分:1)

在问题中给出头部和尾部节点的原因是,如果您的创建恰好成为头部或尾部的替换节点,则更新头部和尾部引用。在另一个词中,给定的前一个节点是标题或尾部。

答案 3 :(得分:0)

您未执行的操作是将插入y之前的p之前的元素链接到y。因此,当y在p之前插入时,现在没有人指向y(至少在您显示的代码中没有)。

如果您知道必须插入y的元素的位置,则只能在恒定时间内插入。如果您必须搜索该位置,那么您永远不能在单个链接列表中插入常量时间。

答案 4 :(得分:0)

如何使用已存在的代码? LinkedHashMap,LinkedList,LinkedHashSet。您还可以查看代码并从中学习。

答案 5 :(得分:0)

create a node ptr
ptr->info = item //item is the element to be inserted...
ptr->next = NULL
if (start == NULL) //insertion at the end...
    start = ptr
else
    temp = ptr
    while (temp->next != NULL)
        temp = temp->next
    end while 
end if
if (start == NULL) //insertion at the beginning...
    start = ptr
else
    temp = start
    ptr->info = item
    ptr->next = start
    start = ptr
end if
temp = start //insertion at specified location...
for (i = 1; i < pos-1; i++)
    if (start == NULL)
        start = ptr
    else
        t = temp
        temp = temp->next
    end if
end for
t->next = ptr->next
t->next = ptr

答案 6 :(得分:0)

在单个LinkedList中,只将节点添加到列表的开头或创建仅包含一个节点的List将采用O(1)。或者,因为他们提供了TailNode也在列表末尾插入节点将花费O(1)。

每隔一次插入操作都需要O(n)。