0

我的导师将函数 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“指向代表 this 的节点序列IntList”。

如果victim和first都指向同一个东西,我们删除了victim,这不也是delete first吗?

4

2 回答 2

3

如果victim和first都指向同一个东西,我们删除了victim,这不也是delete first吗?

在删除时,它们并不指向同一事物。

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

由于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
于 2012-12-01T06:27:01.157 回答
0

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

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

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

于 2012-12-01T07:28:00.510 回答