返回
算法巧思,轻松征服「前端刷题」82:删除排序链表中的重复元素 II
前端
2024-01-20 06:57:21
各位前端开发的大神们,大家好!我是「前端刷题」系列文章的作者,今天我们一起来挑战 LeetCode 上的「82. 删除排序链表中的重复元素 II」难题。
题目
给定一个已排序的链表,删除所有重复的元素,只留下不重复的元素。
示例
输入:1->2->3->3->4->4->5
输出:1->2->5
解题思路
此题的关键在于如何处理重复元素。我们可以利用一个哑结点(dummy node)来简化问题,它指向链表的头部。然后,我们遍历链表,逐个比较相邻元素的值。如果两个相邻元素的值相同,则将后一个元素删除。
具体步骤如下:
- 创建一个哑结点并将其指向链表的头部。
- 初始化两个指针:
prev
指向哑结点,curr
指向链表的第一个元素。 - 遍历链表,使用
while
循环,条件为curr
不为null
。 - 如果
curr
和prev.next
的值相等,则说明当前元素是重复的。将prev.next
指向curr.next
,跳过当前元素。 - 如果
curr
和prev.next
的值不相等,则说明当前元素是不重复的。将prev
指向curr
,curr
指向curr.next
。 - 返回哑结点的
next
,它指向处理后的链表。
代码实现
/**
* 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}
*/
const deleteDuplicates = (head) => {
if (!head) return head;
const dummy = new ListNode(0, head);
let prev = dummy;
let curr = head;
while (curr) {
if (curr.val === prev.next.val) {
prev.next = curr.next;
} else {
prev = curr;
}
curr = curr.next;
}
return dummy.next;
};
总结
这道题考察了我们在链表操作和元素比较方面的能力。通过巧妙地使用哑结点和逐个比较的方式,我们可以高效地删除链表中的重复元素。
希望这篇讲解对大家有所帮助。如果您还有任何疑问,欢迎在评论区留言。我们一起学习,共同进步!