LeetCode 83.删除排序链表中的重复元素(c++)

225 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

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

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

示例 1:

输入: head = [1,1,2]
输出: [1,2]

示例 2:

输入: head = [1,1,2,3,3]
输出: [1,2,3]

提示:

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

二、思路分析

这是一道简单难度的题目,今天我决定从头开始,系统的学习一遍数据结构与算法的知识,否则零零散散的刷题感觉很难有效果。因为今天看的是链表的相关内容,所以就选择了链表的题目来写。对我而言,链表的概念是比较陌生的,尽管书本上的内容我已经看过了,但在实际编程过程中我仍然感到有些茫然。

梳理一下思路,因为链表已经是升序,所以重复元素之间必然是相邻的关系。判断是否重复的方法其实跟数组差不多,但链表跟数组是不相同的,数组是由固定连续的一片区域进行存储,而链表的存储则更加灵活,每一个节点由值(val)和存储着下一个节点的地址的值(next)组成。

因此,若要删除链表中的重复值,仅仅需要在每一个节点时判断该节点的val和下一个节点的val是否相等即可,若相等,则将该节点中储存着下一个节点的地址的next改为下下个节点的地址,即可达到删除的目的。

三、AC代码

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

提交排名

image.png

四、总结

链表的应用很多,需要用心学习