我创建了一个链表,我的目标是删除链表中重复的数据。每个节点中只有一个数据和指针组件。该算法可能并不完美,但我担心的是,为什么在尝试删除节点时,Xcode中会出现错误SIGABRT
。当if
条件为true时,代码中会出现错误。不知道SIGABRT
是什么意思。
void LinkedList::deleteRepetition(const LinkedList& list)
{
node* temp_value = nullptr;
node* traverser = nullptr;
temp_value = head;
traverser = head;
for (int i = 0; i < NODES; i++)
{
for (int j = 0; j < NODES - i; j++)
{
traverser = temp_value->next;
if (traverser->data == temp_value->data)
{
delete traverser;
}
}
traverser = temp_value;
temp_value = temp_value->next;
}
}
第二个循环将再次迭代已移除的元素。当您找到相同的节点时,也需要交换指针。右侧版本:
void LinkedList::deleteRepetition(const LinkedList& list)
{
node* node1 = head;
node* node2 = nullptr;
node* duplicate = nullptr;
while(node1 != nullptr && node1->next != nullptr)
{
node2 = node1;
while(node2->next != nullptr)
{
if(node1->data == node2->next->data)
{
duplicate = node2->next;
node2->next = node2->next->next;
delete duplicate
}
else
{
node2 = node2->next;
}
}
node1 = node1->next;
}
}
请注意,最后一个元素中的next
必须为NULL。
这里您的方法是错误的。循环内部,迭代后再次访问相同的内存并损坏。所以你需要在循环内部更新它。
我的方法也是一样,可能会对你有所帮助
void removeDuplicates(struct node *start)
{
struct node *ptr1, *ptr2, *dup;
ptr1 = start;
/* Pick elements one by one */
while(ptr1 != NULL && ptr1->next != NULL)
{
ptr2 = ptr1;
/* Compare the picked element with rest of the elements */
while(ptr2->next != NULL)
{
/* If duplicate then delete it */
if(ptr1->data == ptr2->next->data)
{
/* sequence of steps is important here */
dup = ptr2->next;
ptr2->next = ptr2->next->next;
free(dup);
}
else /* This is tricky */
{
ptr2 = ptr2->next;
}
}
ptr1 = ptr1->next;
}
}
使用while循环,我试图节省检查某些条件的时间,我们可以忽略