You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有序链表去重C++代码疑问:删除重复节点后无需更新curr?

关于有序链表去重代码的疑问

我写了一段用于删除有序链表重复节点的C代码,运行正常,但有个疑问:在removeDuplicates函数的if代码块中,删除重复节点后,为什么不需要执行curr = curr->next来更新curr的值?while循环是怎么知道curr的更新状态的?(我还是C初学者)

#include <iostream>
using namespace std;

class Node
{
    public:
    int data;
    Node *next;
    
    Node(int data)
    {
        this->data = data;
        this->next = NULL;
    }
};


void push(Node* &head, Node* &tail, int data)
{
    if(head==NULL)
    {
        Node* newNode = new Node(data);
        head = newNode;
        tail = newNode;
        return;
    }
    
    else
    {
        Node* newNode = new Node(data);
        tail -> next = newNode;
        tail = newNode;
    }
}

void print(Node* &head)
{
    Node *temp = head;
    while(temp!=NULL)
    {
        cout<<temp->data<<" ";
        temp = temp->next;
    }
}

void removeDuplicates(Node* &head)
{
    if(head==NULL)
    {
        cout<<"Empty LL!";
        return;
    }
    
    if(head -> next == NULL) 
    {
        cout << "Single Node in LL" << endl;
        return ;
    }
    
    Node* curr = head;
    
    while(curr!=NULL)
    {
        if(curr->next!=NULL && (curr->data == curr->next->data))
        {
            Node* temp = curr->next;
            curr->next = curr->next->next;
            temp->next = NULL;
            delete temp;
            
        }
        
        else
        {
             curr = curr->next;
        }
    }
}


int main()
{
    Node* head = NULL;
    Node* tail = NULL;
    
    push(head, tail, 25);
    push(head, tail, 50);
    push(head, tail, 50);
    push(head, tail, 67);
    print(head);
    cout<<endl;
    removeDuplicates(head);
    print(head);
    return 0;
}

核心原因:处理连续重复节点的需求

因为这是有序链表,重复节点是连续出现的,代码的逻辑就是要一次性清理完当前节点后面所有连续的重复项,所以不能随便移动curr。

为什么删除后不用移动curr?

当进入if块时,说明curr和curr->next的值重复了。我们做的操作是把curr的next指针跳过当前重复节点,直接指向curr->next->next,然后删掉那个重复节点。

这时候curr不能移动——因为新的curr->next可能还是和curr的值重复(比如连续三个相同节点的情况)。如果这时候移动curr,就会漏掉后面的重复节点。

举个实际例子:链表是50 -> 50 -> 50

  1. 第一次循环:curr指向第一个50,发现curr->next也是50,删除第二个50,链表变成50 -> 50。如果这时候移动curr到第二个50,下一次循环就会直接走到NULL,留下最后一个50,导致去重不彻底。
  2. 不移动curr的话,下一次循环还是检查第一个50和新的curr->next(第三个50),继续删除,直到curr->next的值和curr不同,才会进入else块移动curr。

while循环怎么知晓curr的状态?

while循环的判断条件是curr!=NULL,而curr只有在else块才会被更新为curr->next。在if块里,curr本身的指针没有变,只是curr->next的指向变了——但while循环并不关心curr->next的变化,它每次循环都会重新检查curr是否为NULL,以及curr->next的值是否和curr重复。

总结一下逻辑:

  • 当有重复节点时,只修改curr的next指针,curr留在原地继续检查下一个节点是否还重复;
  • 当没有重复节点时,才移动curr到下一个位置,继续遍历。

这样就能保证所有连续的重复节点都被彻底删除。

内容的提问来源于stack exchange,提问作者codecodecoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:40:04