链表 - 元素在删除后出现



我有一个Node类来实现链表:

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

在解决方案类中,我有插入、删除重复项、打印等方法;

现在removeDuplicates我的逻辑是:

  • 如果我当前的下一个节点为空,则返回
  • 如果"当前"的值等于"当前">
  • 的"下一个"值,则在"当前"旁边设置
  • 使用下一个递归

所以这是我的代码:

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;
                    }
           }

问题出在你的进程函数上,请看下面修改后的代码

 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);
 }

下面显示的是来自代码的行,您可以在其中实现在存在重复项时要执行的操作。

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

所以你在这里做的是让节点指针移动到下一个节点。您应该编写代码,使其在重复的情况下跳过下一个节点,并且只能通过操作当前节点的下一个指针来做到这一点。如下所示:

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

如果你想保持代码的逻辑并获得预期的结果,你只需要添加一个字符。 您需要更换

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

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

输出将如您所愿。

最新更新