如何删除链表中连续的两项

2023-11-30

void delete_double (LN<T>*& l) {
    if (l == nullptr)
        return;

    LN<T> *p = l;
    while ( p -> next != nullptr && p -> next -> next != nullptr)
    {
        if (p -> value == p -> next -> value) // the current value is equal to the next value in the linked list 
        {
            if (p == l)                     // when the first two values are the same                                        // not sure if it is correct
            {
                l = l -> next -> next;
            }
            else                            // Problem should be here
            {
                LN<T> *to_delete = p;       //  Also tried this (doesn't work)
                p = p->next;
                delete to_delete;           //  LN<T>* to_delete = p;
                                            //  LN<T>* to_delete2 = p -> next;
                LN<T> *to_delete1 = p;      //  l = to_delete2 -> next;
                p = p->next;                //  delete to_delete;
                delete to_delete1;          //  delete to_delete2;
            }
        }
        else
        {
            p = p-> next;
        }
    }
}
//  Image below is my output

在此输入图像描述

你好,我正在编写一个函数,如果两个值相同,它将删除链接列表中的一行中的两个值。当输入类似于“1 -> 2 -> 3 -> 3 -> 4 -> nullptr”时,我的代码似乎停止工作。(输出应该是 1 -> 2 -> 4 -> nullptr)。它退出时没有给我任何错误。我逐行进行了调试,它突然退出并显示“变量不可用”。

我猜测问题是当我删除p时,l指向垃圾,这导致了问题。所以我尝试了一种不同的方法让 l 指向 to_delete -> next。但它仍然不起作用。

我已经尝试了很多个小时来修复它,但调试甚至没有帮助。有人可以帮忙吗?太感谢了!


我已经简化了上面的代码,上面的逻辑也无法帮助您删除多个重复项。那么让我们看一下下面的代码并剖析它:

   void delete_double(LN<T>*& l) {

        if (l == nullptr)
            return;

        LN<T> *p = l;
        LN<T> dummy(0);
        dummy.next = l;
        p = &dummy;

        LN<T> *temp;
        LN<T> *duplicate;
        LN<T> *prev;

        while (p != nullptr && p->next != nullptr)
        {
            temp = p;
            while (p != nullptr && temp->next != nullptr)
            {
                if (p->value == temp->next->value)
                {
                    duplicate = temp->next;
                    temp->next = temp->next->next;
                    delete duplicate;

                    duplicate = p;
                    prev->next = p->next;
                    p = prev;
                    delete duplicate;

                    temp = p;
                }
                else
                {
                    break;
                }
            }
            prev = p;
            p = p->next;
        }

        l = dummy.next;
    }

似乎在开始时需要一个虚拟节点,因为如果我们有 1 -> 1 -> 2,我们需要删除前两个并指向正确的头,即 2。为了避免这种混乱,最好要在开头和结尾保留虚拟节点,只需将列表的输出设置为 p = dummy.next,这是列表的实际开头。

我定义了一些临时的,temp and duplicate、 temp 来帮助我在列表中进一步导航并复制以保存重复值,将指针移动到下一个并删除该节点。prev是指向重复项之前节点的前一个指针。

列表中的每个节点,temp = p我向前移动,直到找到相邻的匹配项p->value == temp->next->value如果存在匹配项,我将删除当前节点及其前面找到的节点。我用prev跟踪器通过正确设置其来恢复列表的顺序next,否则我会脱离内部循环并继续执行下一个值,即外部循环p = p->next.

我不确定你的情况LN<T>struct 所以我已经按照我的想法进行了。

演示链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除链表中连续的两项 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 如何从数据表更新面板[重复]

    这个问题在这里已经有答案了 带有 id myButtonId2 的命令按钮工作正常 我的意思是它更新 myOutputPanel 但数据表内的命令按钮不会更新outputPanel 数据表有特定的更新样式吗
  • Stripe Connect Firebase 功能

    仔细查看后 尝试通过 swift 捕获代码 但仍然需要一个函数来触发代码以获取 Express 帐户进行连接 不会在代码尝试上浪费您的时间 因此寻找 Firebase 函数来设置 Stripe Connect 端点以进行重定向并发回代码以完
  • 提高请求的下载速度

    我正在编写一个从 Dropbox 下载一些视频的脚本 通常我的下载速度约为 150 kb 秒 这是在 Firefox 或 IDM 上使用普通下载器时的情况 但使用此 Python 脚本时 速度变得太慢 不到 10 kb 秒 这是我正在使用的
  • 在 Xcode 中禁用“/* inside block comment”警告

    我在开发时经常需要多个嵌套的多行 或 部分行 注释 Xcode 最近引入了可能是世界上最烦人的警告 它迫使我禁用 警告作为错误 我猜这个警告是为了捕获一种极其罕见的情况 即某人打字错误并导致块 注释没有结束 但 IME 还有许多其他问题会导
  • shebang/hashbang 是做什么用的?

    除了使 AJAX 内容可供 Google 抓取外 shebangs hashbangs 是否还有其他用途 或者就是这样 在 URL 中使用的哈希早在 Ajax 发明之前就已经存在了 它最初的目的是作为页面内子部分的引用 在这种情况下 例如
  • 批量更新xml文件

    我已经搜索了一个小时但没有成功 我的老板希望它是一个批处理文件 我有一个 xml 文件 其中包含以下内容
  • PowerShell 的 Invoke-RestMethod 相当于curl -u(基本身份验证)

    相当于什么 curl u username password 在 PowerShell 中Invoke RestMethod 我试过这个 securePwd ConvertTo SecureString password AsPlainTe
  • iOS 8.1 自动旋转

    在我的项目中 我检查了我需要的所有方向类型 这在 iOS 7 1 上工作正常 但在 iOS 8 1 上无法正常工作 在 iOS 8 1 中 当我以纵向或横向模式打开应用程序时 它工作正常 但在使用过程中我旋转设备时 只有状态栏会更改旋转 我
  • Rails 3/delayed_job - Wanted:延迟邮件的基本示例

    我一直在试图弄清楚如何使用elasted job和rails 3发送延迟邮件 我已经尝试了几乎所有我能想到的可行可能性的组合 我可以让邮件在后台运行 我就是可以 不要让它延迟发送到未来的时间 数据库中的delayed jobs表清除任务 日
  • 如何自动检测Excel中的表格

    我有一本工作簿 其中包含大约 40 个表格 每个文件中的表格都非常混乱 因此您永远不知道表格可能位于工作表中的位置 在某些工作表中 您甚至可能有 2 个或 3 个表 此外 这些表非常非结构化 因此您无法知道行索引或列索引总是在哪里 我确实需
  • 在 DOS 中获取没有回显的键盘输入

    我正在制作游戏 Connect Four 玩家必须输入 1 4 之间的数字 以便圆盘落入其中一列 我目前正在研究第一专栏 问题是你可以输入任何字符并且它会起作用 它只需要在你按 1 时起作用 并且我不知道如何修复它 此外 该数字出现在屏幕左
  • 使用 crontab 执行 php

    我正在尝试按计划运行 php 脚本 所以我认为 crontab 是个好主意 我使用的服务器是Linux 我不太熟悉 所以我遇到的问题是 我不知道如何使脚本从 php 可执行 我需要引用该脚本 或者将其放入可以从命令行运行 php 的文件夹中
  • Jquery - 单击外部或单击另一个下拉列表时关闭下拉列表/删除活动类

    我刚刚创建了自己的 jquery 插件 并且有一个下拉菜单 可以在单击自身时切换 活动 类 我只想在单击元素外部或单击其他下拉列表时删除 活动 类 每个下拉菜单都有不同的标记 但具有相同的类 我通过调用以下命令通过 jquery 初始化了它
  • 如何将“打印”输出重定向到文件?

    我想使用 Python 将打印重定向到 txt 文件 我有一个for循环 这将print我想要重定向时每个 bam 文件的输出all输出到一个文件 所以我尝试输入 f open output txt w sys stdout f 在我的脚本
  • 如何转义正则表达式中所有具有特殊含义的字符

    我只是偶然发现了以下内容 但我无法完全理解 当你在 Ruby 中创建一个新的正则表达式时 如下所示 Regexp new http www example com 它将输出以下内容 http www example com 这是正确的 但没
  • 这里地图位置指针罗盘头?

    这里地图追随者确实可以将指南针头应用于map getPositionIndicator setVisible true 如果是 请分享我的答案 理论上 您可以更改位置指示器的图像 但不支持旋转图像 因此您需要永久替换图像 总而言之 我想说
  • 在工具提示格式化程序中创建图表

    我尝试创建一个内部格式化程序 工具提示配置 在其中我尝试动态创建图表 但未能实现 有什么好主意吗 在工具提示内创建新容器formatter 并且还创建新图表 重要的部分是创建图表after渲染工具提示 例如使用setTimeout Also
  • 在同一页面中在 ColumnDocumentRenderer 和 DocumentRenderer 之间切换?

    我正在使用 iText7 测试一些东西 我有一个场景 我需要在顶部有 DocumentRenderer 段落 然后在同一页面上在其正下方启动 ColumnDocumentRender 2 列 我遇到的问题是 当我更改同一页面上的内容时 它会
  • 测试变量是否是只读的

    要测试变量是否是只读的 有以下丑陋的技巧 True if readonly readonly p egrep declare lower var False if readonly temp var eval var x 2 gt dev
  • 如何删除链表中连续的两项

    void delete double LN