C++正在从列表中间删除节点
C++ deleting node from middle of list
所以我在一个夏季OO类中,我们需要编写一个函数来从链表中间删除一个节点。我真的很接近,但有一些问题。我的代码成功地遍历了链表,但一旦循环找到节点,就很难真正删除节点。到目前为止,我的功能是:
template< class NODETYPE >
bool List< NODETYPE >::removeMiddle( NODETYPE &value, int i )
{
ListNode <NODETYPE> * tempPtr = firstPtr;
ListNode <NODETYPE> * prevPtr ;
int counter=1;
if ( isEmpty() )
return false;
if (i <= 0)
return false;
while (tempPtr != 0 && counter < i){
counter++;
if ( firstPtr == lastPtr )
firstPtr = lastPtr = 0;
else
firstPtr = firstPtr->nextPtr;
prevPtr = tempPtr;
tempPtr = tempPtr->nextPtr;
}
if (counter == i){
value = tempPtr->data; // data being removed
delete tempPtr;
}
}
return true;
RecordCounter--;
}
您忘记更改上一个节点,使其不再指向您删除的节点。
你想要的东西(很大程度上)类似于:
if ( counter == i-1 ) //next node is the one you want to delete
{
aux = tempPtr->nextPtr->nextPtr; //retain next next node
delete tempPtr->nextPtr; //delete next node
tempPtr->nextPtr = aux; //current node now points to the node after the deleted one
}
在没有更多细节的情况下,我的第一个猜测是您没有维护列表的完整性。尽管我对C++非常生疏。
您正在删除tempPtr并跟踪prevPtr。。。但是在删除之后不重新链接列表的两半。
prevPtr->nextPtr = tempPtr->nextPtr
您忘记了调整列表中的链接。节点在delete
之后仍然存在,但现在它是无效的。哎呀!
此功能很有用:
NODETYPE* unlink( NODETYPE*& pNode )
{
NODETYPE* const result = pNode;
pNode = pNode->nextPtr;
return result;
}
称之为传入指向要删除的节点的nextPtr
。返回一个指向该节点的指针,并重新链接列表,使该节点不再在列表中。现在您可以delete
该节点。
如果只有一个指向要删除的节点的指针,并且列表是单独链接的,该怎么办?唐纳德·克努思(Donald Knuth)曾在他的《计算机编程艺术》(The Art of Computer Programming)中问过这个问题(如果我没记错的话)。一种解决方案是与下一个节点交换数据,然后删除下一个结点。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 2D数组来自文本输入,中间有空格
- 尝试删除链表的头部或中间节点时出错
- 如何将项目属性设置为删除警告MSB8004:中间目录不会以落后的斜线结束
- 如何在列表中间释放删除的节点,而没有阀门错误
- 在单个链接列表中间删除一个节点,仅给定对该节点的访问
- 在只给定单个链接列表中间的节点的情况下删除该节点.C++
- 从单链列表的中间删除节点
- C++正在从列表中间删除节点
- C++:删除单向链表中间的节点
- 删除单链表中间的元素
- 正在从链接列表的中间删除c++
- 为什么此代码不删除中间数字?
- 从中间删除元素的最佳数据结构是什么
- Ispunct()不删除字符串中间的逗号
- 删除和替换catarray中间的对象指针
- 删除文件中间的字节而不移动末尾
- 对于可移动类型,删除std::向量中间的元素仍然很昂贵吗