LeetCode系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
题目
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例:
输入: head = [1,1,2]
输出: [1,2]
输入: head = [1,1,2,3,3]
输出: [1,2,3]
提示
- 链表中节点数目在范围
[0, 300]内 -100 <= Node.val <= 100- 题目数据保证链表已经按升序 排列
思路
又是久违的链表题,这题相当于数组去重,而且给定的链表还是排好序的升序链表
那思路就很清晰了,相同项都是相邻项,只需要按顺序遍历一遍,将相邻的重复项删除即可:
- 首先考虑边界情况,长度为
0或1时无需去重,直接返回链表 - 定义一个指针
temp来遍历链表 - 开始遍历,当指针指向的节点为空或下一节点为空时结束循环
- 当指针指向的节点值与下一节点值相同时,将下一节点从链表中去除
- 值不一样则将指针指向下一节点
- 最后返回处理后的链表
细节:一开始我的结束条件是判断是否还有下一节点,但是执行报错后才发现有问题,因为循环里的操作有可能会出现把最后一个节点删除,这是移动当前指针指向下一节点就是 null,这时判断是否有下一节点就会报错,所以结束条件应该是当前节点或下一节点为空时
代码实现
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
// 当链表长度为 0 或 1 时,直接返回该链表
if (!head || !head.next) return head
// 定义指针进行遍历
let temp = head
// 当前节点或下一节点都不为空才进行循环
while(temp && temp.next) {
// 当前节点值与下一节点值相同,则删除下一节点
if(temp.next.val === temp.val) {
temp.next = temp.next.next
} else {
// 不同则移动指针指向下一节点
temp = temp.next
}
}
// 返回链表
return head
};