持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个已排序的链表的头 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;
}
};
提交排名
四、总结
链表的应用很多,需要用心学习