C++实现LeetCode(83.移除有序链表中的重复项)

下面是关于“C++实现LeetCode(83.移除有序链表中的重复项)”的完整攻略。

题目描述

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例1:

输入: 1->1->2
输出: 1->2

示例2:

输入: 1->1->2->3->3
输出: 1->2->3

解题思路

由于链表已经是有序的,所以我们只需要顺序遍历链表,在遍历的过程中判断哪些节点需要删除即可。

具体而言,我们定义一个指针 p,指向链表的当前节点。接着,我们开始循环,进行遍历。在每一个节点 p 身上,如果存在下一个节点,且下一个节点的值和当前节点的值相等,那么我们就需要将下一个节点删除。这里需要注意,删除操作需要保证链表中前后关系的规范,也就是说,需要让当前节点的下一个节点,指向下下一个节点。如果链表的头节点需要被删除,我们可以重新定义头节点为第二个节点。

解题代码

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head == NULL) {
            return head;
        }
        ListNode* p = head;
        while (p->next != NULL) {
            if (p->val == p->next->val) {
                ListNode* temp = p->next;
                p->next = p->next->next;
                delete temp;
            } else {
                p = p->next;
            }
        }
        return head;
    }
};

示例说明

我们可以通过两个不同的示例来说明这段代码的运行。

首先是下面这个示例:

输入:1 -> 1 -> 2 -> 3 -> 3
输出:1 -> 2 -> 3

在这个示例中,由于存在 1 和 3 两个数值出现了重复,因此我们需要删除第二个 1 和第二个 3。具体而言,我们可以在第一个 1 上,判断它的下一个节点是否为相同的数值,由于下一个节点是 1,因此需要删除下一个节点。此时链表变为 1 -> 2 -> 3 -> 3。我们继续判断第一个 3,它的下一个节点是 3,因此需要删除下一个节点。最终,返回的链表为 1 -> 2 -> 3。

接下来是另一个示例:

输入: 1->1->1->2->2->3->4->5->5->6
输出: 1->2->3->4->5->6

在这个示例中,由于存在多个相同的数值,我们需要删除它们,最终返回的是不包含重复节点的链表。在这个示例中,我们首先判断第一个 1,发现它的下一个节点也为 1,因此需要删除下一个节点。此时链表变为 1 -> 2 -> 2 -> 3 -> 4 -> 5 -> 5 -> 6。我们继续判断第一个 2,发现它的下一个节点为相同的数值,需要删除下一个节点。同样的方式,我们将相同的节点删除后,最终返回的链表为 1 -> 2 -> 3 -> 4 -> 5 -> 6。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(83.移除有序链表中的重复项) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • WIFI无线网用户名字怎么改成中文

    修改WIFI无线网用户名字,也就是修改Wi-Fi网络名称(SSID),是非常简单的操作。下面是将WIFI无线网用户名字改为中文的完整攻略。 步骤一:打开路由器管理页面 打开你的浏览器,在地址栏中输入路由器的IP地址,然后按下Enter键。如果你不知道路由器的IP地址,可以查看路由器背后的标签或者参考路由器说明书。 示例一: 路由器IP地址为192.168.1…

    other 2023年6月27日
    00
  • VS2015开发环境的安装和配置

    VS2015开发环境的安装和配置攻略 1. 下载和安装VS2015 首先,你需要下载并安装Visual Studio 2015(简称VS2015)。你可以在Microsoft官方网站上找到VS2015的下载链接。 在网站上找到VS2015的下载链接,并点击下载。 运行下载的安装程序。 在安装程序中选择你想要的安装选项,例如安装位置和所需的组件。 点击“安装”…

    other 2023年7月27日
    00
  • 在C语言编程中使用变量的基础教程

    在C语言编程中使用变量的基础教程 介绍 在C语言中,变量是用来存储数据的一种方式。它们可以用来保存各种类型的数据,如整数、浮点数、字符等。在本教程中,我们将学习如何声明变量、给变量赋值以及如何使用它们。 声明变量 在使用变量之前,我们需要先声明它们。变量的声明告诉编译器变量的名称和类型。C语言中的变量声明遵循以下语法: type variable_name;…

    other 2023年8月9日
    00
  • Android App中实现图片异步加载的实例分享

    Android App中实现图片异步加载的实例分享 在Android应用程序中,实现图片异步加载是一种常见的需求。这可以提高应用程序的性能和用户体验,避免在加载大量图片时出现卡顿现象。下面是一个完整的攻略,包含了两个示例说明。 示例1:使用Picasso库进行图片异步加载 首先,确保在项目的build.gradle文件中添加Picasso库的依赖项: dep…

    other 2023年9月7日
    00
  • Resty开发restful版本的Jfinal深入研究

    Resty开发restful版本的Jfinal深入研究攻略 简介 本攻略将详细介绍如何使用Resty框架开发restful版本的Jfinal应用程序。Resty是一个基于JFinal的轻量级框架,它提供了一种简单而强大的方式来构建RESTful风格的Web应用程序。 步骤 步骤一:创建Jfinal项目 首先,我们需要创建一个Jfinal项目。可以按照以下步骤…

    other 2023年8月6日
    00
  • 用java实现文件的断点续传并发下载

    用Java实现文件的断点续传并发下载 在实际应用中,我们经常会需要下载大文件,如视频、软件等,然而,当我们开始下载后,由于网络问题或者其他原因,下载速度较慢或者下载失败,就需要重新下载,这浪费了我们很多时间和流量。为了避免这种情况,我们可以使用文件的断点续传功能,这样即使下载失败,也可以从上次下载的地方继续下载,不会浪费时间和流量。 实现思路 文件的断点续传…

    其他 2023年3月28日
    00
  • iphone6s死机后如何重启 iphone6s死机了怎么办

    针对“iphone6s死机后如何重启 iphone6s死机了怎么办”这两个问题,我将为您提供完整的攻略。具体步骤如下: iphone6s死机后如何重启 长按开机键和音量键 当您的iPhone 6s出现死机时,您可尝试按住机身右侧的开机键和音量键不放几秒钟。直到出现Apple标志或者其他提示,松开按键。 连接电脑及iTunes 如果长按开机键和音量键后无反应,…

    other 2023年6月27日
    00
  • C语言中带头双向循环链表基本操作的实现详解

    C语言中带头双向循环链表基本操作的实现详解 什么是带头双向循环链表 带头双向循环链表是一种常见的数据结构,在实际开发中也经常会用到。带头双向循环链表可以看作是一种特殊的链表,相对于普通链表,它具有以下特点: 它有一个头结点,头结点不存储数据,它的作用是指向链表中的第一个节点。 每个节点都有一个前驱指针prev和一个后继指针next,用于指向前一个节点和后一个…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部