связанный список - элементы приходят после удаления - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть класс Node для реализации связанного списка:

class Node
{
    public:
        int data;
        Node *next;
        Node(int d){
            data=d;
            next=NULL;
        }
};

И в классе решения у меня есть методы для вставки, удаления дубликатов, печати и т. Д .;

Теперь для removeDuplicates моя логика:

  • если следующий узел моего тока равен нулю, тогда вернуть
  • , если значение тока равно следующему значению тока, затем установить рядом с текущим
  • recurseсо следующим

Так вот мой код:

Node* removeDuplicates(Node* head)
        {
            process(head);
            return head;
        }

        void process(Node* node)
        {
            cout << node->data << endl;
            if(node->next==NULL)
                return;
            if(node->data==node->next->data)
                node=node->next;
            process(node->next);
        }

, когда я вызываю removeDuplicate метод, он печатает: 1 2 3 4 , как и ожидалось, но после этого, когда я снова печатаюс другим моим методом, он дает мне весь связанный список, не удаляя дубликаты: 1 2 2 3 3 4

display метод:

void display(Node *head)
          {
                  Node *start=head;
                    while(start)
                    {
                        cout<<start->data<<" ";
                        start=start->next;
                    }
           }

Ответы [ 3 ]

1 голос
/ 21 ноября 2019

Проблема в вашей функции процесса, см. Модифицированный код ниже

 void process(Node* node)
 {
    cout << node->data << endl;
    if(node->next==NULL)
       return;
    if(node->data==node->next->data) {

       Node *tmp = node->next; 
       node->next = tmp->next;   
       delete(tmp); 
       //  node=node->next;

    }
    process(node->next);
 }
0 голосов
/ 22 ноября 2019

Если вы хотите сохранить логику своего кода и получить ожидаемые результаты, вам просто нужно добавить ровно один символ. Вам необходимо заменить

void process(Node* node) {...}

на

void process(Node*& node) {...}

Вывод будет таким, как вы хотите.

0 голосов
/ 21 ноября 2019

Ниже показаны строки из вашего кода, где вы реализуете, что делать, когда есть дубликаты.

 if(node->data==node->next->data)
       node=node->next;

Итак, вы делаете, чтобы указатель узла перемещался к следующему узлу. Вы должны написать код так, чтобы он пропускал следующий узел в случае дублирования, и вы можете сделать это только путем манипулирования указателем следующего узла текущего. Нечто подобное показано ниже:

 if(node->data==node->next->data)
       node->next=node->next->next;
...