有序链表去重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
- 第一次循环:
curr指向第一个50,发现curr->next也是50,删除第二个50,链表变成50 -> 50。如果这时候移动curr到第二个50,下一次循环就会直接走到NULL,留下最后一个50,导致去重不彻底。 - 不移动
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
相关产品推荐
相关产品推荐

