「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
前言
每天至少一道算法题,死磕算法
昨天我们讲了合并两个有序链表,想必大家对链表都有了一定的了解,今天我们就继续在深入链表,学一下链表的删除,学过数据结构的小伙伴都知道,链表的删除要比循环链表要复杂一些,我们今天要做的事,就是把删除链表变得简单
题目
这是leetcode上的第83道题----83.删除排序链表中的重复元素
给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入: head = [1,1,2]
输出: [1,2]
复制代码
思路
第一步:从题目中提取关键字
- 1.删除所有重复的元素,使每个元素只出现一次
第二步:分析
- 1.只要是对链表操作那就一定是cur.next=xxxx;
-
- 如果要取出重复元素的话,拿我们首先要判断当前节点的值和下一个节点的值是否相等
-
如果相等,那么当前节点的next属性指向如果 - 如果相等,那么当前节点的next属性指向下下下b个o点
-
如果不相等,那么继续循环链表
题解
var deleteDuplicates = function(head) {
// 老套路,循环链表就可以
let cur = head;
while(cur&&cur.next){
// 判断当前的值是否和下一次的值是相等的,如果是相等的话,把指针指向下下一个节点
if(cur.val===cur.next.val){
cur.next=cur.next.next;
}else{
// 循环链表
cur= cur.next;
}
}
return head;
};
复制代码
注意点:
- 1.链表问题一定要考虑
边界
问题,这是重点中的重点
,细节决定成败 - 2.一定要设置一个cur等于head或者dummy节点(我们自己设置的假节点)
- 3.链表题一定一定要画图,画图让你的效率提高很多
- 4.一定要把思路写下来,可能才开始觉得慢,后面就会越来越快啦
总结
链表问题其实并不容易掌握,想要写的得心应手,必须要多加练习。
学习数据结构与算法切忌心浮气躁,要慢慢的来,算法题是培养我们思维的,你要能从每道题里面学到了什么思维,而不是只在乎数量。
明天我们继续加油⛽️ヾ(◍°∇°◍)ノ゙