剑指Offer-56.删除链表中重复的结点(C++/Java)
题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析:
递归思路,如果当前结点和它的next结点的val值不同,则当前结点可以直接接到已处理完的结点后,继续删除重复的过程;如果当前结点和它的next结点的val值相同,则需要继续遍历,直到找到一个与当前结点val不同的结点作为新链表的头结点,如果找不到,说明链表所有结点元素都一样,新链表为NULL,否则从新的头结点出发,继续删除重复的过程。
非递归思路,新建一个虚拟头结点,若当前结点和它的next结点的val值不同,意味着不是重复结点,可以加入到已处理完的结点后,若相同,需要找到一个与当前结点不同的结点,再重新判断。注意遍历结束后要把最后的当前结点加入到处理完结点之后。
程序:
C++
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == nullptr || pHead->next == nullptr)
            return pHead;
        if(pHead->val != pHead->next->val){
            pHead->next = deleteDuplication(pHead->next);
            return pHead;
        }
        else{
            ListNode* p = pHead;
            while(p != nullptr && p->val == pHead->val)
                p = p->next;
            return deleteDuplication(p);
        }
    }
};
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == nullptr || pHead->next == nullptr)
            return pHead;
        ListNode* dummyHead = new ListNode(0);
        ListNode* p = dummyHead;
        ListNode* curr = pHead;
        while(curr != nullptr && curr->next != nullptr){
            if(curr->val != curr->next->val){
                p->next = curr;
                p = p->next;
            }
            else{
                while(curr->next != nullptr && curr->val == curr->next->val)
                    curr = curr->next;
            }
            curr = curr->next;
        }
        p->next = curr;
        return dummyHead->next;
    }
};
Java
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null || pHead.next == null)
            return pHead;
        if(pHead.val != pHead.next.val){
            pHead.next = deleteDuplication(pHead.next);
            return pHead;
        }
        else{
            ListNode p =  pHead;
            while(p != null && p.val == pHead.val)
                p = p.next;
            return deleteDuplication(p);
        }
    }
}
剑指Offer-56.删除链表中重复的结点(C++/Java)的更多相关文章
- 剑指Offer 56. 删除链表中重复的结点 (链表)
		
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
 - [剑指Offer] 56.删除链表中重复的结点
		
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
 - 【剑指Offer】删除链表中重复的结点 解题报告(Python)
		
[剑指Offer]删除链表中重复的结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...
 - 【Java】 剑指offer(18) 删除链表中重复的结点
		
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重 ...
 - 【剑指offer】删除链表中重复的结点
		
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1->2->3->3->4->4->5 处理后为 ...
 - 剑指offer:删除链表中重复的结点
		
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...
 - 剑指offer——20删除链表中重复的结点
		
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
 - Go语言实现:【剑指offer】删除链表中重复的结点
		
该题目来源于牛客网<剑指offer>专题. 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字. 示例 1: 输入: 1->2->3->3- ...
 - 【剑指offer】删除链表中重复的节点,C++实现(链表)
		
0.简介 本文是牛客网<剑指offer>笔记. 1.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1-> ...
 - 剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
		
1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...
 
随机推荐
- 使用AnalyticDB轻松实现以图搜图和人脸检索
			
1. 背景 以图搜图在生活中有着广泛的应用, 当我们在电视上看到有人穿着一件美丽的裙子或者帅气的球鞋也想拥有时, 我们可以拍张照片然后打开淘宝然后上传照片就可以快速的找到这个商品. 我们看到一张电影截 ...
 - 我在阿里巴巴做 Serverless 云研发平台
			
简介: Serverless 云研发平台经过这半年多的蜕变,已经从简单的解决工程链路的平台演进成一个面向研发.上线.运维的全生命周期研发平台,后续要解决的命题会集中在用户低门槛上. 作者 | 林昱(苏 ...
 - Arthas 使用的各类方式
			
简介: Arthas 是阿里巴巴开源的 Java 诊断工具.让我们能够在线排查项目发生的问题.除了知道它的存在之外,我们也需要知道我们如何去安装使用它,以便于提高我们日常开发解决 BUG 的效率. A ...
 - WPF 修复 ContextMenu 在开启 PerMonitorV2 后所用 DPI 错误
			
本文告诉大家如何修复 WPF 的 ContextMenu 在开启 PerMonitorV2 之后,在双屏不同的 DPI 的设备上,在副屏弹出的 ContextMenu 使用了主屏的 DPI 导致缩放错 ...
 - C语言,实现数字谱到简谱的转换
			
C语言,实现数字谱到简谱的转换 前言:本文初编辑于2024年4月28日 CSDN:https://blog.csdn.net/rvdgdsva 博客园:https://www.cnblogs.com/ ...
 - 异构数据源同步之表结构同步 → 通过 jdbc 实现,没那么简单
			
开心一刻 今天坐沙发上看电视,旁边的老婆拿着手机贴了过来 老婆:老公,这次出门旅游,机票我准备买了哈 我:嗯 老婆:你.我.你爸妈.我爸妈,一共六张票 老婆:这上面还有意外保险,要不要买? 我:都特么 ...
 - kibana-6.2.4-amd64的安装
			
ubuntu系统 kibana: https://mirrors.huaweicloud.com/kibana/?C=N&O=D 找到6.2.4的下载连接 方法一: 下载tar包,解压即可: ...
 - JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)
			
运用JS的innerHTML,和for循环实现日历小部件内容和日期的转换. <!DOCTYPE html> <html> <head> <title>日 ...
 - 在 ThinkPad E470 上安装 Ubuntu 16.04 无线网卡驱动
			
目录 文章目录 目录 安装 安装 # 查看无线网卡驱动类型,E470 一般为 RTL8821CE lspci # 安装必要工具 sudo apt-get install build-essential ...
 - docker镜像仓库管理Harbor
			
一 部署Harbor 前提: Harbor需要运行在docker上面,所以首先需要在harbor部署机器上面自行部署docker和docker-compose docker-compose安装命令如下 ...