目录
从排序链表中删除重复项
算法
示例
输出
结论
首页 后端开发 C++ 使用递归从已排序的链表中删除重复项

使用递归从已排序的链表中删除重复项

Sep 01, 2023 pm 01:45 PM
链表 重复项 递归 删除 已排序

使用递归从已排序的链表中删除重复项

链表是连接在一起的元素序列。每个列表都有一个头和一系列节点,每个节点都有当前节点的数据并链接到下一个节点。链表的基本操作是插入、删除、查找和删除。

从排序链表中删除重复项

删除节点的一​​种方法是使用递归。其思想是将每个节点与其相邻节点进行比较,并删除它们相等的重复节点。

我们的递归调用将返回到下一个节点。因此,对于下一个元素,我们将调用递归函数,例如 current_node->next = our_function(node->next)。

我们相信我们的递归,current_node->next 现在包含链表,其中没有任何重复元素。

在主要方法中,我们从头开始对列表进行竞价 -

Node* head = new Node(5);
head->next = new Node(5);
head->next->next = new Node(6);
head->next->next->next = new Node(7);
head->next->next->next->next = new Node(7);
head->next->next->next->next->next = new Node(7); 
登录后复制

算法

使用递归从排序链表中删除重复项的方法的过程如下。

  • 第 1 步 - 创建一个链表,其中所有值按顺序排序

  • 步骤 2 - 如果链表不存在,则程序终止。

  • 步骤 3 - 如果链表确实存在,则将头节点的下一个值与头节点中的值进行比较。如果两个值相同,则删除头部。

  • 第 4 步 - 第 3 步递归执行, 将每个节点视为头,直到列表删除所有重复值来自自身。

  • 步骤 5 - 获得的输出是具有不同值的排序链表

示例

例如,我们有一个具有以下值的排序链表 -

1->1->1->2->3->3->4

让我们看一个 C++ 程序,它将使用递归从上面的排序链表中删除重复项 -

#include <iostream>
using namespace std;
class Node {
   public:
   int data;
   Node* next;
   Node(int data) {
   this->data = data;
   next = NULL;
   }
};
Node* solve(Node* head) {
   if (head == NULL)
   return NULL;
   head->next = solve(head->next);
   if (head->next != NULL && head->next->data == head->data) {
      Node* temp = head->next;
      delete head;
      return temp;
   }
   return head;
}
void printList(Node* node) {
   while (node != NULL) {
      cout << node->data << (node->next == NULL ? "" : "->");
      node = node->next;
   }
}
int main() {
   Node* head = new Node(1);
   head->next = new Node(1);
   head->next->next = new Node(1);
   head->next->next->next = new Node(2);
   head->next->next->next->next = new Node(3);
   head->next->next->next->next->next = new Node(3);
   head->next->next->next->next->next->next = new Node(4);
   cout << "Linked list before: ";
   printList(head);
   head = solve(head);
   cout << "\nLinked list after: ";
   printList(head);
   return 0;
}
登录后复制

之后,我们检查是否将当前节点包含到链表中。如果我们从当前节点->下一个节点得到的满足链表与该节点具有相同的值,则不包含该节点;否则,我们将包括在内。

注意 - 当当前节点为 NULL 时,我们返回递归的基本条件。

输出

Linked list before: 1->1->1->2->3->3->4
Linked list after: 1->2->3->4
登录后复制

结论

正如我们在递归调用中看到的,我们相信下一次调用能够实现问题其余部分的预期结果。我们刚刚解决了当前的子问题。记住这一点,我们检查是否可以包含当前元素,并将链表的其余部分交给我们的递归调用,并信任它从那时起为我们提供有效的链表。当我们遍历整个链表时,我们的方法的时间复杂度是 O(n)。

以上是使用递归从已排序的链表中删除重复项的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1419
52
Laravel 教程
1313
25
PHP教程
1262
29
C# 教程
1235
24
C++ 函数的递归实现:递归深度有限制吗? C++ 函数的递归实现:递归深度有限制吗? Apr 23, 2024 am 09:30 AM

C++函数的递归深度受到限制,超过该限制会导致栈溢出错误。限制值因系统和编译器而异,通常在1000到10000之间。解决方法包括:1.尾递归优化;2.尾调用;3.迭代实现。

微信拉黑再删除永久加不上是真的吗 微信拉黑再删除永久加不上是真的吗 Apr 08, 2024 am 11:41 AM

1、首先,拉黑再删除永久加不上是假的,拉黑删除后想要再加对方,只要对方同意即可。2、如果用户将某人拉黑,对方将无法向用户发送消息、查看用户的朋友圈以及与用户进行通话。3、拉黑并不意味着将对方从用户的微信联系人列表中删除。4、如果用户在拉黑后又将对方从用户的微信联系人列表中删除,那么在删除后是没有办法恢复的。5、如果用户想再次添加对方为好友,需要对方同意并重新添加用户。

抖音聊天记录怎么彻底消除干净 抖音聊天记录怎么彻底消除干净 May 07, 2024 am 11:14 AM

1、打开抖音app,点击界面底部的【消息】,点击需要删除的聊天对话入口。2、长按任意一条聊天记录,点击【多选】,勾选想要删除的聊天记录。3、点击右下角的【删除】按钮,在弹出的窗口中选择【确认删除】即可将这些记录永久删除。

C++ lambda 表达式是否支持递归? C++ lambda 表达式是否支持递归? Apr 17, 2024 pm 09:06 PM

是的,C++Lambda表达式可以通过使用std::function支持递归:使用std::function捕获Lambda表达式的引用。通过捕获的引用,Lambda表达式可以递归调用自身。

PHP实用技巧:删除代码中的最后一个分号 PHP实用技巧:删除代码中的最后一个分号 Mar 27, 2024 pm 02:24 PM

PHP实用技巧:删除代码中的最后一个分号在编写PHP代码时,常常会遇到需要删除代码中最后一个分号的情况。这可能是因为复制粘贴引入了多余的分号,或者为了优化代码风格和结构。在本文中,我们将介绍一些方法来删除PHP代码中的最后一个分号,并且提供具体的代码示例。方法一:使用substr函数substr函数可以从字符串中返回指定长度的子字符串。我们可以

C++ 函数的递归实现:递归与非递归算法的比较分析? C++ 函数的递归实现:递归与非递归算法的比较分析? Apr 22, 2024 pm 03:18 PM

递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。选择递归或非递归取决于问题和实现的具体限制。

微信朋友圈怎么删除 微信朋友圈怎么删除 Apr 08, 2024 pm 03:25 PM

1、打开微信app,点击右下角的【我】,找到并点击【朋友圈】选项。2、点击右上角的【我的朋友圈】,在我的朋友圈界面找到想要删除的朋友圈内容。3、点击进入这条朋友圈的详情页,点击该条内容发布时间右侧的【小垃圾桶】图标。4、在弹出的窗口中选择【确定】即可,这样就完成了删除朋友圈内容的操作。

C++ 递归进阶:理解尾递归优化及其应用 C++ 递归进阶:理解尾递归优化及其应用 Apr 30, 2024 am 10:45 AM

尾递归优化(TRO)可提高特定递归调用的效率。它将尾递归调用转换为跳转指令,并将上下文状态保存在寄存器中,而不是堆栈上,从而消除对堆栈的额外调用和返回操作,提高算法效率。利用TRO,我们可以针对尾递归函数(例如阶乘计算)进行优化,通过将tail递归调用替换为goto语句,编译器会将goto跳转移化为TRO,优化递归算法的执行。

See all articles