在 C++ 中检测并移除链表中的环2025年3月17日 | 阅读 8 分钟 在本文中,我们将讨论如何在 C++ 中使用不同的方法检测和移除链表中的循环。 创建一个名为 detectAndRemoveLoop() 的函数,该函数验证给定链表是否存在循环。如果存在,它将移除循环并返回 true。如果列表中不存在循环,则返回 false。下图描绘了一个带有循环的链表。下面的列表必须使用 detectAndRemoveLoop() 方法更改为 1->2->3->4->5->NULL。 ![]() 编写一个 C 函数来检测链表中的循环。
方法 1:(分别检查每个)已知 弗洛伊德循环检测 过程在快指针和慢指针在同一位置碰撞时结束。此外,我们知道这个公共点是循环节点之一(上图中的 2、3、4 或 5)。将此位置放入指针变量中,例如 ptr2。之后,从链表的头部开始,通过单独检查每个节点来确定每个节点是否可从 ptr2 到达。当链表中的节点可到达时,我们可以获取指向该节点前一个节点的指针,表明该节点代表循环的开始。 输出 Linked List after removing Loop 50 20 15 4 10 方法 2:(更好的解决方案)
程序 让我们举一个例子来说明如何在 C++ 中检测和移除链表中的循环。 输出 ![]() 复杂度分析 时间复杂度: O(N),其中 N 是树中的节点数 辅助空间: O(1) 方法 3:(不计算循环中的节点数)无需计算循环中的节点数。在识别循环之后,如果我们以相同的速度移动快指针和慢指针直到快指针不相遇,它们将在循环的开始处碰撞。 这是如何工作的? 让 弗洛伊德循环检测 算法导致慢指针和快指针碰撞。下图描绘了发现循环时的场景。 ![]() 我们可以从上图中得出结论。 从上面的方程,我们可以得出以下结论 因此,如果我们将两个指针再次以相同的速度移动,一个指针(我们称之为 slow)将从链表的头节点开始,而另一个指针(我们称之为 fast)将从相遇点开始。当慢指针到达循环的开始处(已移动 m 步)时,快指针也已移动了 m 步,因为它们现在以相同的速度移动。它们将在开始处碰撞,因为快指针从 k 开始,并且 m+k 是 n 的倍数。 程序 输出 ![]() 复杂度分析 时间复杂度: O(N),其中 N 是树中的节点数 辅助空间: O(1) 方法 4:哈希(哈希链表节点的地址)我们可以通过在无序映射中哈希链表节点的地址来检查元素是否已存在于映射中。我们必须将最后一个节点的下一个指针设置为 NULL,因为如果它存在,我们已经通过循环到达了一个已存在的节点。 程序 输出 ![]() 复杂度分析 时间复杂度: O(N),其中 N 是树中的节点数。 辅助空间: O(N),其中 N 是树中的节点数(由于哈希)。 下一主题C++ 与 Go 语言的区别 |
双端队列,或双端队列,是序列容器,可提供在开头和结尾的高效插入和删除(Cormen 等人,2009)。与 vector 类似,双端队列允许通过索引位置访问元素。但是,它们在几个关键方面有所不同。首先,虽然 vector 保证……
阅读 4 分钟
在 C++ 中,还存在一种情况,即需要通过最小增量来找到数组中的最小排除值 (MEX)。MEX 通常找到数组元素中未出现的最小非负整数。最终产物...
18 分钟阅读
借助模拟器,程序员可以体验编程的黄金时代,它在现代硬件上重现了古老的 Turbo C++ 开发环境。自由软件基金会是 Windows、macOS、Linux 等现代操作系统上执行 Turbo C++ 的简单方法...
5 分钟阅读
在本文中,我们将讨论 std::numeric_limits::max() 和 std::numeric_limits::min() 函数,包括它们的语法和示例。std::numeric_limits::max() 是什么? std::numeric_limits<T>:: max() 方法返回由数值类型 T 表示的最大有限数字。所有算术类型都可以用于类型 T。头文件:#include<limits> 模板:static T max() throw(); static...
阅读 2 分钟
将一个整数乘以自身会得到称为平方的简单数学运算。可以使用简单的 C++ 程序来完成。理解平方:对数字进行平方是一项基本的数学过程。在数学表示法中,将数字 'x' 平方写为 'x^2',其中 'x' 是...
阅读 3 分钟
C++ 中的标准模板库 (STL) 包含 cshift() 函数,该函数与 std::valarray 一起使用。根据提供的移位计数,此函数以圆形方式移动 valarray 中的元素,向左或向右移位。移出的元素...
阅读 4 分钟
C++ 类以防止对象复制 C++ 类实例有时根本不应被克隆。防止此类对象复制的三种方法是:不可复制的混合体、私有复制构造函数和赋值运算符,或者删除这些特定成员函数。不合适...
阅读 4 分钟
在本文中,您将了解 C++ 中的 mbsrtowcs() 函数及其示例。在 C/C++ 中,mbsrtowcs() 函数是管理字符串中字符转换的有效工具。它是标准 C 库的一个重要组成部分,可帮助开发人员处理各种字符……
阅读 4 分钟
回文数是指反转后仍然相同的数字。例如 121、34543、343、131、48984 是回文数。回文数算法 从用户获取数字 将数字保存在临时变量中 反转数字 将临时数字与反转后的数字进行比较 如果两个数字相同,则...
阅读1分钟
引言:迷宫长期以来一直吸引着解谜者和游戏开发人员的思维;驾驭复杂的格子、在障碍之间穿梭并最终到达目标的挑战一直是一种永恒的追求。在本文中,我们将讨论如何...
11 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India