我正在研究即将进行的测试的学习指南,我们需要准备为链接列表实现一个奇怪的功能,以确保我们真正理解它们。
我们应该制作一个方法:void decimate();删除每个第10个节点。但是,当我在调用decimate()后打印列表时,列表保持不变。我错过了什么?
void decimate()
{
//iterate through the list
//keep a counter
//when counter is 10, remove that node
temp = head;
for(int i = 0; i < 10; i++)
{
temp = temp->next;
}
prev = temp;
prev->next = temp->next;
delete temp;
}
答案 0 :(得分:3)
这两行中的第二行什么都不做:
prev = temp;
prev->next = temp->next;
如果您将prev
设置为temp
,那么prev.next
已经temp.next
不是吗?
EDIT。所以我被叫出了一个伪答案,我觉得这很公平......你需要考虑跳过被抽取的节点,你需要指出被删除的项目指向的内容而不是保留一个引用你删除的那个。
答案 1 :(得分:0)
您必须像下面一样修改您的方法。您必须始终有一个指针指向要删除的节点,即team
。请参阅我的以下评论。它们非常重要。
void decimate()
{
//iterate through the list
//keep a counter
//when counter is 10, remove that node
temp = head;
for(int i = 0; i < 10; i++)
{
prev = temp;// this line of code should be here
//prev is pointing to team and in below code temp is pointing to the next node
temp = temp->next;
}
// here `prev->temp;` prev is pointing to temp
prev->next = temp->next;// now prev is point to the node next to temp;
//after the above code temp is detached from the list
delete temp;
}
现在请看下面的错误: -
prev = temp;// prev and temp both are pointing to the same node
prev->next = temp->next;// wrong nothing going to happen
delete temp;
// if you make temp = NULL; here you will lost the rest of the list
同样删除实际上不要破坏内存区域。它将保持不变。删除只是将该区域标记为可以自由重新分配/重新使用。这就是为什么即使在删除之后你仍然可以看到整个列表。
答案 2 :(得分:0)
您正尝试将prev指定给temp,而不是prev指定以前的temp,然后删除temp。 而你的decimate()函数正在删除唯一的第10个元素,而不是每10个元素,所以检查这是否是预期的。