【算法】删除排序链表中的重复元素难度:简单 题目: 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元
难度:简单
题目:
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
解题思路:
要删除一个已排序链表中的重复元素,使得每个元素只出现一次,我们可以使用一个简单的遍历方法。由于链表已经是排序好的,我们可以直接遍历链表并检查当前节点与其后继节点的值是否相同。如果相同,则跳过重复的节点;如果不相同,则继续遍历。
- 初始化指针:创建一个指针
current
指向链表的头节点。 - 遍历链表:遍历链表直到
current.next
为空。 - 检查重复:如果当前节点
current
的值与下一个节点current.next
的值相同,则跳过下一个节点,即将current.next
设置为current.next.next
。 - 继续遍历:如果当前节点
current
的值与下一个节点current.next
的值不同,则将current
指针移动到下一个节点。 - 返回结果:遍历完成后返回链表的头节点。
JavaScript实现:
/**
* 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 current = head;
while (current && current.next) {
if (current.val === current.next.val) {
current.next = current.next.next; // 跳过重复节点
} else {
current = current.next; // 继续遍历
}
}
return head;
};
// 示例
// const createLinkedList = (values) => {
// let dummyHead = new ListNode(0);
// let current = dummyHead;
// values.forEach(value => {
// current.next = new ListNode(value);
// current = current.next;
// });
// return dummyHead.next;
// };
// const list = createLinkedList([1, 1, 2]);
// console.log(deleteDuplicates(list)); // 输出: 1 -> 2
转载自:https://juejin.cn/post/7423949528514887706