加油 第 10、11 练 忙完一段时间今天继续算法练习
83. 删除排序链表中的重复元素
题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
今天这道题目要简单的多
- 给定的链表是按升序排列的链表,因此我们可以知道重复元素在链表中出现的位置是连续的
- 如果当前节点cur与vur.next重复,那么cur.next = cur.next.next,否则cur = cur.next 继续循环
- 循环条件:cur 和 cur.next 存在
var deleteDuplicates = function(head) {
var cur = head;
while(cur && cur.next) {
if(cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
};
82. 删除排序链表中的重复元素 II
题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
比上一题要多一个注意点
只保留没有重复出现的
- 重复元素是连续的
- cur.next 与 cur.next.next相同
- 循环条件 cur、cur.next、cur.next.next存在
var deleteDuplicates = function (head) {
if (!head) return null;
// 设置一个哑结点:头节点可能会有重复
const dummy = new ListNode(0, head);
let cur = dummy;
// 当下一个节点存在,且删除节点后要链接的节点存在
while (cur.next && cur.next.next) {
// 如果节点值相等
if (cur.next.val == cur.next.next.val) {
// 记录相同的这个值
const x = cur.next.val;
// 下一个节点值仍相等
while (cur.next && cur.next.val == x) {
cur.next = cur.next.next;
}
} else {
cur = cur.next;
}
}
return dummy.next;
}