我一直在为涉及双重链接列表的学校项目工作,我一直无法删除列表的最后一个节点。
bool DLL::remove(string ss, int & count){
Node* temp = new Node;
if(headPtr == NULL){
return false;
}
else{
temp = headPtr;
for(int i = 0; i < itemCount-1; i++){
if(temp->ssn.compare(ss) == 0){
if(temp->pred == NULL){
count += 1;
itemCount -= 1;
headPtr = temp->succ;
return true;
}
if(temp->succ != NULL){
temp->succ->pred = temp->pred;
temp->pred->succ = temp->succ;
return true;
}
if(temp->succ == NULL){
temp->pred->succ = NULL;
return true;
}
}
else{
if(temp->succ == NULL){
return false;
}
temp = temp->succ;
}
}
}
return false;
}
我的代码适用于我现在想到的项目或者好的节点,它位于开头或中间的任何位置,但是当它是列表中的最后一项时,它不会将其删除。
示例输出:
列表:10,20,30,40,50 当我删除10,30和50时,结果是 清单:20,40,50
任何帮助将不胜感激。 succ代表继任者,而pred则代表我的教授的前任。
答案 0 :(得分:2)
您正在迭代itemcount - 2
而非itemcount - 1
,因此忽略了最后一个元素,因为您使用的是< itemcount - 1
。循环应该是:
for (int i = 0; i < itemCount; i++) {
}
通过遵循指针迭代链接列表要容易得多:
Node *node;
for (node = head; node != NULL; node = node->succ) {
}
除了您的问题之外,没有必要将temp
分配给new
,因为它被分配给head
等,因此它被赋予了一个值。您还应该调用delete
在您删除的节点上,否则会泄漏内存。