我创建了一个链表,我的目标是删除链表中的重复数据。每个节点中只有一个数据和指针组件。该算法可能不完美,但我担心的是为什么我在尝试删除节点时在Xcode中收到错误if
。当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;
}
}
意味着什么。
<script>
$(function(){
var text = $('.chapters').html();
console.log(text);
var str = text.match(/<\/blockquote>([\s\S]*?)<\/div>/);
console.log(str);
});
</script>
答案 0 :(得分:0)
这里你的方法是错误的。内部for循环,迭代后再次访问相同的内存并被破坏。所以你需要在里面进行循环更新。
我的方法也是如此,可能会帮助你
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循环我试图节省检查一些我们可以忽略的条件的时间
答案 1 :(得分:0)
您的第二个循环再次迭代已删除的元素。当你找到相同的节点时,你需要交换指针。正确的版本:
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。