删除双向链表的最后一个节点(c ++)

时间:2016-03-16 07:30:06

标签: c++ doubly-linked-list

我一直在为涉及双重链接列表的学校项目工作,我一直无法删除列表的最后一个节点。

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则代表我的教授的前任。

1 个答案:

答案 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在您删除的节点上,否则会泄漏内存。