在链表中删除

时间:2010-12-08 12:38:15

标签: c++ c

只给出一个指向要删除的节点的指针,我们如何删除链表中的节点......?

6 个答案:

答案 0 :(得分:6)

这个问题太模糊了,很可能是出于某种原因(例如,产生一个对话,而不是测试你对数据结构的实际了解)。他们可能会期待你问“这是双重链接列表还是单链表?”如果它是一个双向链表,那么这很简单:

curr->prev->next = curr->next;
curr->next->prev = curr->prev;
delete curr;

如果它是单链表,则必须具有头节点,以便您可以在列表中找到上一个节点。因此他们可能会期待您询问是否有指向头节点的指针。伪代码将是:

loop from head to end until test->next == curr
test->next = curr->next;
delete curr;

或者,如果您可以修改列表(没有头节点):

temp = curr->next;
curr->data = temp->data;
curr->next = temp->next;
delete temp;

答案 1 :(得分:3)

嗯,这只是一个技巧。

假设curr是给定的地址,以下是伪代码:

to_delete = curr->next
curr->data = to_delete->data
curr->next = to_delete->next
delete to_delete

基本上,这只是将列表中下一个节点的数据和下一个指针复制到当前节点,并删除下一个节点。

答案 2 :(得分:2)

我认为如果你没有任何指向列表头的指针,那么在单链表中几乎是不可能的。你应该总是有一个链表头指针。

答案 3 :(得分:1)

在标准链表实现中,您来修改指向要删除的节点的节点。要修改它,您必须先找到它。如果您有一个指向列表头的指针,或者在删除列表头之前的任何元素,您可以通过遍历列表找到它。如果没有,这个问题没有通用的解决办法。

您可以通过修改链接列表的定义以某种方式标记已删除的节点(例如,使用布尔属性deleted)来摆脱这种情况,然后修改列表遍历以跳过此类节点。

答案 4 :(得分:1)

You have a pointer to that node (say, node N). Meaning, you have access on that node.
If that node has pointer to it's front node and it's back node, then simply point the back node to the front node. And the front node to the back of your node N.

To illustrate: 
step 1:
---> [ node ] ---> [ node ] ---> [ node ] ---> 
<--- [  M   ] <--- [  N   ] <--- [  O   ] <--- etc...

step 2:
---> [ node ] -----------------> [ node ] ---> 
<--- [  M   ] <--- [node N] <--- [  O   ] <--- etc...

step 3:
---> [ node ] -----------------> [ node ] ---> 
<--- [  M   ] <----------------- [  O   ] <--- etc...

                                    [ node ] ---> (still points to node O)
      (still points to node M) <--- [  N   ]

step 4:
just point Node N to NULL
                                    [ node ] ---> NULL
                          NULL <--- [  N   ]

result:
---> [ node ] -----------------> [ node ] ---> 
<--- [  M   ] <----------------- [  O   ] <--- etc...

答案 5 :(得分:1)

如果这不是尾巴,我有一个解决方案。

如果是单链表,您只需与您旁边的节点“交换”并删除该节点。

假设我有

struct Node
{
  T value;
   Node * next;
};

解决方案就像:

void freeNode( Node * node )
{
   Node * next = node->next;
   if( next )
   {
      node->value = next->value;
      node->next = next->next;
      free( next ); 
   }
   // else I'm stuck!
}

上述C和C ++的伪混合。

如果我们拥有的节点是尾部,并假设尾部由node-&gt; next == NULL指示,我不能使前一个节点进入尾部,所以我无法解决。