链表 - 元素在删除后出现
linked list - elements come after removing
我有一个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) {...}
输出将如您所愿。
相关文章:
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 从矢量中删除元素后出现隔离错误
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- C++映射不删除元素
- 如何从标准::元组中删除元素?
- 在动态数组中添加/删除C++元素
- 如何通过比较彼此的成员从QStringList中删除元素
- 如何修复从矢量中删除元素的错误?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 使用remove_if从矢量中删除元素
- 用C++从三维矢量中删除元素
- 从对象数组中删除元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- C++ - 按自定义数据类型向量的值删除元素
- 从任意容器中廉价删除元素的惯用方法?
- 从数组中删除元素不起作用的函数
- 删除元素 BST
- 从向量中删除元素时未处理的异常