【发布时间】:2017-03-28 20:08:42
【问题描述】:
我有双循环链表
struct Element {
int data;
Element *next;
Element *previous;
};
struct List {
Element *head;
};
任务是删除具有相同数据的元素/节点。例如,如果列表有 1,1,3,4,5,1,解析函数 value=1 后应该如下 3,4,5。
bool removeAllValue(List &l, int value) {
if(!l.head)
return false;
else if(l.head->next == l.head && l.head->data == value){
l.head = NULL;
return true;
}
Element *p = l.head;
do{
if(p->data == value)
removeElement(l, p);
p = p->next;
}while(p!=l.head);
return true;
上面是遍历元素的函数,找到具有给定值/数据的元素并调用以下函数删除元素。
void removeElement(List &l, Element *element){
Element *previous = element->previous;
Element *next = element->next;
Element *head = l.head;
if(next == head){ //if element is tail of the list
l.head->previous = element->previous; // relinking head's previous to new tail
element->previous->next = head;
}else if(element == head){ // if element is head of the list
l.head = next; // relinking head to tail
l.head->previous = previous; // relinking tail to head
}else{
previous->next = next;
next->previous = previous;
}
delete element;
}
我尝试了不同的方法,但它总是给我错误。问题在于重新连接尾部和头部,我认为但我找不到修复它的方法。
【问题讨论】:
-
第一种情况(元素是尾巴)看起来很奇怪。在这种情况下,你为什么要调整 head->next 呢?为什么tail的前一个指向头部?
-
@MarekFekete 谢谢。改成关注
l.head->previous = element->previous; element->previous->next = head; -
看起来更好。有帮助吗?
-
@MarekFekete 不,如果列表是 1,2,1,1 在它给出 2,1,1,0 的函数之后。
-
另外一个问题是你在
removeElement中做了delete element,然后在调用函数中仍然使用它(p=p->next)。
标签: c++ data-structures doubly-linked-list