C++ C++;删除具有重复值的节点时,链表会导致分段错误
对于排序后的链表,比如说C++ C++;删除具有重复值的节点时,链表会导致分段错误,c++,pointers,linked-list,segmentation-fault,C++,Pointers,Linked List,Segmentation Fault,对于排序后的链表,比如说1->1->1->1->2->2->3->3->4->4,我想删除所有重复项,使链表中的每个节点都具有唯一的值(即,上面的链表应该变成1->2->3->4->) 我的算法是: 指针ptr最初指向链表的头部。另一个指针“nextt指向头部的下一个节点。(ptr->next) 当nextt的值保持与ptr相同时,nextt指针向前移动,直到值不同或nextt到达列表末尾 但是,在运行代码时,我收到一个分段错误 当我们到达列表的末尾时,内部while循环会导致nextt 变为N
1->1->1->1->2->2->3->3->4->4
,我想删除所有重复项,使链表中的每个节点都具有唯一的值(即,上面的链表应该变成1->2->3->4->
)
我的算法是:
ptr
最初指向链表的头部。另一个指针“nextt
指向头部的下一个节点。(ptr->next
)nextt
的值保持与ptr
相同时,nextt
指针向前移动,直到值不同或nextt
到达列表末尾nextt
变为NULL
。这就是出错的地方吗
在纸上模拟不同的输入也无济于事。我不确定错误在哪里
谢谢。问题是你的状况
while((ptr->val==nextt->val)和&(nextt!=NULL))
取消引用nextt
,以访问nextt->val
。当nextt
为空时,这是访问冲突
将循环条件更改为:
while((next!=NULL)和&(ptr->val==nextt->val))
因此,如果
next==NULL
,则条件将短路并计算为false。问题在于您的条件
while((ptr->val==nextt->val)和&(nextt!=NULL))
取消引用nextt
,以访问nextt->val
。当nextt
为空时,这是访问冲突
将循环条件更改为:
while((next!=NULL)和&(ptr->val==nextt->val))
因此,如果
next==NULL
,则条件将短路并计算为false。Yes。这就解释了。非常感谢。:-)对这就解释了。非常感谢。:-)
ListNode* deleteDuplicates(ListNode* A)
{
ListNode *ptr = A, *nextt;
if (A == NULL)
return A;
if (A->next == NULL)
return A;
while (1)
{
if ((ptr == NULL) || (ptr->next == NULL))
break;
nextt = ptr->next;
while ((ptr->val == nextt->val) && (nextt != NULL))
nextt = nextt->next;
ptr->next = nextt;
ptr = ptr->next;
}
return A;
}