题目1
题目链接:
- 力扣:删除排序链表中的重复元素
题目简述:
- 删除所有重复的元素,使每个元素
只出现一次
题解:
/**
* 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) {
let cur = head // 给head创建一个帮手,让他去查找删除,确保最后可以无脑 return head
// 既然要比较当前结点和下个结点,那么两个结点都必须是有值的
while (cur !== null && cur.next !== null) {
if (cur.val === cur.next.val) {
cur.next = cur.next.next
} else {
cur = cur.next
}
}
return head
}
题目2
题目链接:
- 牛客网:JZ76 删除链表中重复的结点
- 力扣:删除排序链表中的重复元素 II
题目简述:
- 删除该链表中重复的结点,重复的结点
不保留
题解:
/**
* 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 === null || head.next === null) {
return head
}
let dummy = new ListNode()
// dummy 用于固定head,或者说固定链表的头部结点,即时head被删,dummmy.next 一定也是头部结点
dummy.next = head
let cur = dummy // cur指针用于更改结点next指向
while (cur.next && cur.next.next) {
if (cur.next.val === cur.next.next.val) {
const val = cur.next.val
while (cur.next && cur.next.val === val) {
cur.next = cur.next.next
}
} else {
cur = cur.next
}
}
return dummy.next
总结:
两道题非常相似,可以放到一起总结
相同点:删除重复元素的方法
cur.next = cur.next.next不同点:
第1题,重复的结点有一个保留下来的,不需要定义
dummy结点,用当前的结点比对后面的结点,一个个删就好;第2题,重复的结点全部删除,那么就需要有一个前驱结点dummy题目2,将某组重复的结点一次性删除,使用到了
while循环