Удаление дубликатов из связанных списков

#c

Вопрос:

 #include<iostream>
using namespace std;

struct Node{
int data=0;
Node* next=NULL;
};

void removeDuplicates(Node* head){  
Node *ptr,*ptr2,*temp;
ptr=head;


while(ptr->next!=NULL amp;amp; ptr!=NULL){
    ptr2=ptr;
    while(ptr2->next!=NULL){
        if(ptr2->next->data==ptr->data){
            temp=ptr2->next;
            ptr2->next=temp->next; 
            
            temp->next=NULL;
            delete(temp);
            
        }
        else ptr2=ptr2->next;   
    }
    ptr=ptr->next;
} 
}
void display(Node *head){
Node* ptr=head;
while(ptr!=NULL){
    cout<<ptr->data<<" ";
    ptr=ptr->next;
}
cout<<endl;
}

int main(){
int n;
cin>>n;
Node* head=NULL;
Node *tail=NULL;
for(int i=0;i<n;i  ){
    Node *newNode=new Node();
    
    cin>>newNode->data;
    
    if(head==NULL){
        head=newNode;
        tail=newNode;
    } 
    else{
        tail->next=newNode;
        tail=newNode;   
    }
}
display(head);
removeDuplicates(head);
display(head);

}
 

Приведенный выше код предназначен для удаления повторяющихся элементов в связанном списке .
Приведенный выше код не показывает никакого результата, если последний элемент списка является повторяющимся элементом .например (2 1 1 2 1) ,(1 1 1 1)
Код отлично работает для (1 2 1 3) (1 2 1 2 3)
Любая помощь будет оценена по достоинству.

Комментарии:

1. Для таких вещей, как списки, я предлагаю вам взять простой список, который у вас есть, и нарисовать его на бумаге карандашом. Используйте поля для узлов и стрелки для указателей (включая ссылки). Затем попробуйте выполнить операции, стирая и перерисовывая стрелки. Подробно описывайте все шаги, которые вы делаете. Как только вы решите, что он работает на бумаге, вы переведете этот алгоритм в код, который напишете и протестируете. Если это не сработает, используйте отладчик для пошагового выполнения кода и убедитесь, что он следует шагу, который вы записали на бумаге (и нарисуйте операции, которые выполняет ваша программа).

Ответ №1:

ошибка здесь была в 1-м цикле while в функции removeDuplicate(head)

 while(ptr->next!=NULL amp;amp; ptr!=NULL)
 

Необходимо поставить ptr!=NULL условие перед ptr->next!=NULL ошибкой сегментации в противном случае
Пожалуйста, учитесь на моем опыте 🙂