我有一个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) {...}
输出将如您所愿。