C ++链表在删除具有重复值的节点时会出现分段错误
C++ Linked List gives Segmentation fault when removing nodes with duplicate values
对于一个排序的链表,比如1->1->1->1->2->2->3->3->4->4->4
,我想删除所有重复项导致链表的每个节点都具有唯一值(即上面的链表应该变成1->2->3->4->
.)
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;
}
我的算法是:
- 一个指针
ptr
最初指向链表的头部。另一个Pointer 'nextt
指向从头开始的下一个节点。 (ptr->next
).
- 而
nextt
的值与ptr
保持不变,nextt
指针向前遍历,直到值不同或nextt
到达末尾列表。
但是,在 运行 代码中,我收到了一个分段错误。
当我们到达列表末尾时,内部 while 循环导致 nextt
变成 NULL
。这是错误的地方吗?
在纸上模拟不同的输入也无济于事。我不确定错误在哪里。
谢谢。
问题是你的情况
while((ptr->val==nextt->val) && (nextt!=NULL))
取消引用 nextt
以访问 nextt->val
。当 nextt
为 NULL 时,这是一个访问冲突。
将循环条件更改为:
while ((next != NULL) && (ptr->val == nextt->val))
因此,如果 next == NULL
,则条件将短路并评估为 false。
对于一个排序的链表,比如1->1->1->1->2->2->3->3->4->4->4
,我想删除所有重复项导致链表的每个节点都具有唯一值(即上面的链表应该变成1->2->3->4->
.)
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;
}
我的算法是:
- 一个指针
ptr
最初指向链表的头部。另一个Pointer 'nextt
指向从头开始的下一个节点。 (ptr->next
). - 而
nextt
的值与ptr
保持不变,nextt
指针向前遍历,直到值不同或nextt
到达末尾列表。
但是,在 运行 代码中,我收到了一个分段错误。
当我们到达列表末尾时,内部 while 循环导致 nextt
变成 NULL
。这是错误的地方吗?
在纸上模拟不同的输入也无济于事。我不确定错误在哪里。
谢谢。
问题是你的情况
while((ptr->val==nextt->val) && (nextt!=NULL))
取消引用 nextt
以访问 nextt->val
。当 nextt
为 NULL 时,这是一个访问冲突。
将循环条件更改为:
while ((next != NULL) && (ptr->val == nextt->val))
因此,如果 next == NULL
,则条件将短路并评估为 false。