我正在进行一项任务,告诉我假设我有一个带有标题和尾节点的单链表。它要我在位置p之前插入一个项目y。任何人都可以查看我的代码并告诉我,我是否在正确的轨道上?如果没有,你可以向我提供任何提示或指示(没有双关语)?
tmp = new Node();
tmp.element = p.element;
tmp.next = p.next;
p.element = y;
p.next = tmp;
我想我可能错了,因为我根本没有使用头部和尾部节点,即使在问题描述中特别提到它们。我正在考虑编写一个while循环来遍历列表,直到它找到p并解决问题,但这不会是恒定时间,是吗?
答案 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)。