该函数如何从链表中删除元素?

时间:2012-12-01 06:23:51

标签: c++ linked-list

我的讲师将函数remove()定义为:

struct node
{
  node *next;
  int value;
}

int IntList::remove()
{
  node *victim = first;
  int result;

  if(isEmpty()) throw listIsEmpty();

  first = victim->next;
  result = victim->value;
  delete victim;
  return result;
}

其中first“指向表示此IntList的节点序列。”

如果受害者和第一个都指向相同的东西,并且我们删除了受害者,那么这次也不删除吗?

2 个答案:

答案 0 :(得分:3)

  

如果受害者和第一个都指向相同的东西,并且我们删除了受害者,那么这次也不删除吗?

在删除时,他们并没有指向同一件事。

基本上这里发生的是第二个节点成为第一个节点,然后删除旧的第一个节点。

自删除前first = victim->next起,first == victim将永远不会相同,除非victim->next == victim永远不会发生在链接列表中。


对于简化示例,假设:

first is at address 0xDEAD (crazy address, but go with it)
first->next is at address 0xF00D

然后就像这样:

node *victim = first; //victim = 0xDEAD
first = victim->next; //first = 0xF00D, so first now = first->next
delete victim; //victim = 0xDEAD, so you deleted the original first

答案 1 :(得分:0)

,绝对不会删除列表中的第一个节点。

因为在'int IntList :: remove()'函数中,它首先向前移动第一个节点,然后删除受害节点。

因此,它只会删除受害者,在您的情况下,列表的下一个节点将是新的第一个节点。 :)