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

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

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

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

Example 1:

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

Example 2:

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

和之前那道 Remove Duplicates from Sorted List 不同的地方是这里要删掉所有的重复项,由于链表开头可能会有重复项,被删掉的话头指针会改变,而最终却还需要返回链表的头指针。所以需要定义一个新的节点,然后链上原链表,然后定义一个前驱指针和一个现指针,每当前驱指针指向新建的节点,现指针从下一个位置开始往下遍历,遇到相同的则继续往下,直到遇到不同项时,把前驱指针的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 之后的结点存在,且值相等,那么先进行一个 while 循环,跳过后面所有值相等的结点,到最后一个值相等的点停下。比如对于例子2来说,head 停在第三个结点1处,然后对后面一个结点调用递归函数,即结点2,这样做的好处是,返回的值就完全把所有的结点1都删掉了。若 head 之后的结点值不同,那么还是对 head 之后的结点调用递归函数,将返回值连到 head 的后面,这样 head 结点还是保留下来了,因为值不同嘛,最后返回 head 即可,参见代码如下:

解法二:

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(82.移除有序链表中的重复项之二)的文章就介绍到这了,更多相关C++实现移除有序链表中的重复项之二内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++ 如何实现线程注入

    c++ 如何实现线程注入

    本文主要介绍了各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等
    2021-06-06
  • C++设计模式之工厂方法模式

    C++设计模式之工厂方法模式

    这篇文章主要介绍了C++设计模式之工厂方法模式,它是对简单工厂模式的扩展,,需要的朋友可以参考下
    2014-09-09
  • C语言数据结构不挂科指南之队列详解

    C语言数据结构不挂科指南之队列详解

    这篇博客主要介绍一下队列的概念,并且采用 C 语言,编写两种存储实现方式:顺序存储和链式存储,当然还有常规的队列基本操作的实现算法
    2022-09-09
  • C语言中isdigit()函数和isxdigit()函数的用法

    C语言中isdigit()函数和isxdigit()函数的用法

    这篇文章主要介绍了C语言中isdigit()函数和isxdigit()函数的用法,用来判断字符师傅为阿拉伯数字和16进制数字,需要的朋友可以参考下
    2015-08-08
  • C++ Boost Optional示例超详细讲解

    C++ Boost Optional示例超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • Qt消除警告的实现示例

    Qt消除警告的实现示例

    Qt5 和 Qt6 之间存在一些差异,导致在编译时可能产生警告,为了消除这些警告,Qt 提供了一些宏定义来帮助你在代码中处理这些差异,本文主要介绍了Qt消除警告的实现示例,感兴趣的可以了解一下
    2023-09-09
  • C语言分治法实现归并排序

    C语言分治法实现归并排序

    这篇文章主要为大家详细介绍了C语言实现归并排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • C++中int类型按字节打印输出的方法

    C++中int类型按字节打印输出的方法

    这篇文章主要给大家介绍了关于C++中int类型按字节打印输出的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • C/C++指针和取地址的方法

    C/C++指针和取地址的方法

    C/C++指针和取地址的方法,需要的朋友可以参考一下
    2013-04-04
  • C++ random_shuffle()方法案例详解

    C++ random_shuffle()方法案例详解

    这篇文章主要介绍了C++ random_shuffle()方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论