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

 更新时间:2021年07月13日 17:14:15   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(83.移除有序链表中的重复项),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 83. Remove Duplicates from Sorted List 移除有序链表中的重复项

Given a sorted linked list, delete all duplicates such that each element appear only once.

Example 1:

Input: 1->1->2
Output: 1->2

Example 2:

Input: 1->1->2->3->3
Output: 1->2->3

这道题让我们移除给定有序链表的重复项,那么可以遍历这个链表,每个结点和其后面的结点比较,如果结点值相同了,只要将前面结点的 next 指针跳过紧挨着的相同值的结点,指向后面一个结点。这样遍历下来,所有重复的结点都会被跳过,留下的链表就是没有重复项的了,代码如下:

解法一:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode *cur = head;
        while (cur && cur->next) {
            if (cur->val == cur->next->val) {
                cur->next = cur->next->next;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};

我们也可以使用递归的方法来做,首先判断是否至少有两个结点,若不是的话,直接返回 head。否则对 head->next 调用递归函数,并赋值给 head->next。这里可能比较晕,先看后面一句,返回的时候,head 结点先跟其身后的结点进行比较,如果值相同,那么返回后面的一个结点,当前的 head 结点就被跳过了,而如果不同的话,还是返回 head 结点。可以发现了,进行实质上的删除操作是在最后一句进行了,再来看第二句,对 head 后面的结点调用递归函数,那么就应该 suppose 返回来的链表就已经没有重复项了,此时接到 head 结点后面,在第三句的时候再来检查一下 head 是否又 duplicate 了,实际上递归一直走到了末尾结点,再不断的回溯回来,进行删除重复结点,参见代码如下:

解法二:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (!head || !head->next) return head;
        head->next = deleteDuplicates(head->next);
        return (head->val == head->next->val) ? head->next : head;
    }
};

到此这篇关于C++实现LeetCode(83.移除有序链表中的重复项)的文章就介绍到这了,更多相关C++实现移除有序链表中的重复项内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 剖析C++编程中friend关键字所修饰的友元函数和友元类

    剖析C++编程中friend关键字所修饰的友元函数和友元类

    这篇文章主要介绍了剖析C++编程中friend关键字所修饰的友元函数和友元类,友元了以后在外部就可以访问到正常情况下无法访问到的私有属性和方法,需要的朋友可以参考下
    2016-01-01
  • C++ OpenCV实现图像去水印功能

    C++ OpenCV实现图像去水印功能

    本文将介绍如何使用OpenCV C++ 进行简单图像水印去除。我们在网上download图片时,经常因为版权问题有水印。本案例通过编写算法进行简单水印去除。需要的可以参考一下
    2022-01-01
  • C++超详细梳理IO流操作

    C++超详细梳理IO流操作

    当程序与外界进行信息交换时,存在两个对象,一个是程序中的对象,另一个是文件对象。流是信息流动的一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动
    2022-07-07
  • boost字符串处理函数format的用法

    boost字符串处理函数format的用法

    这篇文章介绍了boost字符串处理函数format的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C++超详细实现二叉树的遍历

    C++超详细实现二叉树的遍历

    本章将会详细讲解二叉树遍历的四种方式,分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前,会先带大家回顾一下二叉树的基本概念
    2022-05-05
  • C++浅析STL 迭代器 容器的使用

    C++浅析STL 迭代器 容器的使用

    这篇文章主要介绍了C++ STL、迭代器、容器,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • C语言 常量,变量及数据详细介绍

    C语言 常量,变量及数据详细介绍

    这篇文章主要介绍了C语言 常量,变量及数据详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • 基于C++中setiosflags()的用法详解

    基于C++中setiosflags()的用法详解

    下面小编就为大家带来一篇基于C++中setiosflags()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • C++ WideCharToMultiByte()函数案例详解

    C++ WideCharToMultiByte()函数案例详解

    这篇文章主要介绍了C++ WideCharToMultiByte()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 贪吃蛇游戏C++命令行版实例代码

    贪吃蛇游戏C++命令行版实例代码

    这篇文章主要介绍了贪吃蛇游戏C++命令行版实例代码,包含了常见的循环语句及相关游戏规则的判定方法,有助于更好的理解游戏设计原理,需要的朋友可以参考下
    2014-09-09

最新评论