LeetCode 83. 删除排序链表中的重复元素

本文详细解析了在排序链表中删除重复元素的算法,通过遍历链表并比较相邻节点值,仅保留一个重复元素,同时处理了头尾边界条件,避免使用虚拟头节点。

一、题目分析 && 整体思路

如题所述,原题中给定的是一个排序的链表,所以它重复的元素都一定是相邻的;

如果采用遍历的方式,那就可以:

1、把这个链表从头到尾遍历一遍,找到相邻的重复元素节点;

2、再把重复的元素节点删掉,只保留一个元素节点。

 

二、如何删除重复节点,或者说如何在相同节点中只保留一个

要保证连续多个元素相同的情况下都能适应,我们把这个题分成了两种情况:一种是连续两个元素相同的情况、另一种是连续两个元素以上相同的情况。

1、两个元素相同

当发现当前节点的值与下一个节点的值相同,就把后面的相同节点删除掉,current就继续向下走,如果发现不同,就继续向下移动,current移动到最后就完成了。

2、两个元素以上相同

current发现当前节点值与下一个节点值相同,删除下一节点,也就用cur.next = cur.next.next,current的next指针也就指向了当前节点的下一个的下一个节点。然后再此比较当前节点的值与下一个节点的值是否相同的,结果发现还是相同的,这时候,我们再次执行一遍cur.next = cur.next.next,这时的next节点又向下指向了一个节点。

如果再下一个节点不再相同,则current就可以向下移动节点了。

 

三、头尾边界条件的处理

首先来看这道题需不需要虚拟头节点?

不需要,因为我们的思路是当遇到两个元素重复的时候,我们去删除掉重复元素后面的元素,保留所有重复元素的第一个,即使第一个元素和第二个元素重复,我们也是去删除第二个元素,也就是说头节点无论在什么情况下都不会被删除的,自然也就不需要虚拟头节点了。

current需要在最后一个节点还是倒数第二个节点就可以完成任务?

current在倒数第二个节点是完全可以的,因为我们可以比较current和current.next这两个值。

当最后两个值不同,我们已经将current和current.next这两个值做了比较,是不需要继续往下移动的;

当最后两个值相同,current在最后倒数第二个节点的位置就可以将最后一个节点删除了,将current.next指向null,因为在链表中,哪个元素的下一个节点指向了null,哪个元素就是最后一个节点,所以,也不需要继续往下移动。

设定current移动到倒数第二个位置的条件是:cur != null && cur.next != null。

 

Code

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode cur = head;//current的起始位值是真正的头节点(不需要虚拟头节点)
        //current的终止条件,也就是需要current在链表中的倒数第二个节点停下
        while(cur != null && cur.next != null){
            //如果值相同,则删除掉下一个节点
            if(cur.val == cur.next.val){
                cur.next = cur.next.next;
            }else{
                //如果值不相同,就将current下移
                cur = cur.next;
            }
        }
        return head;
    }
}

 

 

 

 

 

 

标题基于Spring Boot的音乐播放网站设计与实现研究AI更换标题第1章引言介绍音乐播放网站的研究背景、意义、国内外现状及论文方法与创新点。1.1研究背景与意义阐述音乐播放网站在当今数字化时代的重要性与市场需求。1.2国内外研究现状分析国内外音乐播放网站的发展现状及技术特点。1.3研究方法以及创新点概述论文采用的研究方法及在设计与实现上的创新点。第2章相关理论与技术基础总结音乐播放网站设计与实现所需的相关理论和技术。2.1Spring Boot框架介绍介绍Spring Boot框架的基本原理、特点及其在Web开发中的应用。2.2音乐播放技术概述概述音乐播放的基本原理、流媒体技术及音频处理技术。2.3数据库技术选型分析适合音乐播放网站的数据库技术,如MySQL、MongoDB等。第3章系统设计详细介绍音乐播放网站的整体设计方案。3.1系统架构设计阐述系统的层次结构、模块划分及各模块的功能。3.2数据库设计介绍数据库表结构、关系及数据存储方式。3.3界面设计用户界面的设计原则、布局及交互方式。第4章系统实现详细介绍音乐播放网站的具体实现过程。4.1开发环境与工具介绍开发所需的软件、硬件环境及开发工具。4.2核心功能实现阐述音乐播放、搜索、推荐等核心功能的实现细节。4.3系统测试与优化介绍系统测试的方法、过程及性能优化策略。第5章研究结果与分析呈现音乐播放网站设计与实现的研究结果。5.1系统功能测试结果展示系统各项功能的测试结果,包括功能完整性、稳定性等。5.2用户反馈与评价收集并分析用户对音乐播放网站的使用反馈与评价。5.3对比方法分析将本设计与实现与其他类似系统进行对比分析,突出优势与不足。第6章结论与展望总结音乐播放网站设计与实现的研究成果,并展望未来发展方向。6.1研究结论概括音乐播放网站设计与实现的主要成果及创新点。6.2展望指出当前研究的不足,提出未来改进方向及可
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值