一次删除多个节点链接列表。

时间:2012-03-03 16:51:30

标签: c++ c data-structures

我需要实现一个带链接列表的动态数组,并在满足某个条件时删除多个节点。假设节点的数据部分大于固定值,请删除该节点。

我可以在列表的一个遍历中删除多个节点而不返回列表的头部并搜索要删除的下一个节点吗?我能用双链表做到这一点吗?我需要做的就是在满足条件时删除某些节点并同时继续遍历列表而不返回列表的头部。

1 个答案:

答案 0 :(得分:1)

从双向链表中的任何位置删除元素通常都没有问题。显然,你不能做的是从你刚删除的元素沿着列表移动 - 它不再是列表的一部分。当你遍历它时,诀窍是继续对列表中的项进行有效引用。由于您没有提供代码,我将使用STL std::list及其迭代器给出一个示例:

std::list<int> mylist;
mylist.push_back(1);
mylist.push_back(2);
mylist.push_back(3);
mylist.push_back(4);

// now we want to remove elements 2 and 4
std::list<int>::iterator current = mylist.begin();
// current: item 1
++current;
// current: item 2
mylist.erase(current); // remove item 2
++current; // BUG! the iterator is invalid after removing the item it references

代替:

std::list<int>::iterator current = mylist.begin();
// current: item 1
++current;
// current: item 2
std::list<int>::iterator next = current;
++next; // move 'next' to item 3
mylist.erase(current); // remove item 2
current = next; // make current point to item 3
++current;
// current: item 4
mylist.erase(current); // remove item 4

这不是特定于STL链表(或C ++) - 而不是迭代器,你可能有一个指向元素的指针,但它的原理是相同的。