返回

算法巧思,轻松征服「前端刷题」82:删除排序链表中的重复元素 II

前端

各位前端开发的大神们,大家好!我是「前端刷题」系列文章的作者,今天我们一起来挑战 LeetCode 上的「82. 删除排序链表中的重复元素 II」难题。

题目

给定一个已排序的链表,删除所有重复的元素,只留下不重复的元素。

示例

输入:1->2->3->3->4->4->5
输出:1->2->5

解题思路

此题的关键在于如何处理重复元素。我们可以利用一个哑结点(dummy node)来简化问题,它指向链表的头部。然后,我们遍历链表,逐个比较相邻元素的值。如果两个相邻元素的值相同,则将后一个元素删除。

具体步骤如下:

  1. 创建一个哑结点并将其指向链表的头部。
  2. 初始化两个指针:prev 指向哑结点,curr 指向链表的第一个元素。
  3. 遍历链表,使用 while 循环,条件为 curr 不为 null
  4. 如果 currprev.next 的值相等,则说明当前元素是重复的。将 prev.next 指向 curr.next,跳过当前元素。
  5. 如果 currprev.next 的值不相等,则说明当前元素是不重复的。将 prev 指向 currcurr 指向 curr.next
  6. 返回哑结点的 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;
};

总结

这道题考察了我们在链表操作和元素比较方面的能力。通过巧妙地使用哑结点和逐个比较的方式,我们可以高效地删除链表中的重复元素。

希望这篇讲解对大家有所帮助。如果您还有任何疑问,欢迎在评论区留言。我们一起学习,共同进步!