返回

用JavaScript巧妙删除排序链表中的重复元素,掌握两种方法!

前端

让我们从了解问题开始。leetcode第83题要求我们从一个排序的链表中删除所有重复的元素,并返回修改后的链表。例如,给定链表[1, 1, 2, 3, 3],函数应返回[1, 2, 3]。

解决这个问题有两种常见的方法:

方法一:一次遍历

这种方法使用一个指针一次遍历链表。当指针遇到重复元素时,它将删除该元素。以下是如何使用JavaScript实现该方法:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */

/**
 * Given a sorted linked list, delete all duplicates such that each element appear only once.
 *
 * @param {ListNode} head
 * @return {ListNode}
 */
const deleteDuplicates = (head) => {
  if (head === null) {
    return null;
  }

  let current = head;
  while (current.next !== null) {
    if (current.val === current.next.val) {
      current.next = current.next.next;
    } else {
      current = current.next;
    }
  }

  return head;
};

方法二:两个指针

这种方法使用两个指针来解决这个问题。一个指针指向未处理的头,另一个指针用来遍历链表。当遍历指针遇到重复元素时,它将跳过该元素并继续前进。以下是如何使用JavaScript实现该方法:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */

/**
 * Given a sorted linked list, delete all duplicates such that each element appear only once.
 *
 * @param {ListNode} head
 * @return {ListNode}
 */
const deleteDuplicates = (head) => {
  if (head === null) {
    return null;
  }

  let dummy = new ListNode(0, head);
  let prev = dummy;
  let current = head;

  while (current !== null) {
    if (current.val !== prev.val) {
      prev.next = current;
      prev = current;
    }
    current = current.next;
  }

  prev.next = null;

  return dummy.next;
};

每种方法都有其自身的优点和缺点。方法一比较简单,但效率较低,因为每次遇到重复元素时,它都需要重新遍历链表。方法二的效率更高,但实现起来也更复杂。

在实际应用中,您可以根据具体情况选择最适合的方法。例如,如果链表很长,那么使用方法二可能会更好。如果链表很短,那么使用方法一也无妨。

希望这篇文章对您有所帮助。如果您有任何问题,请随时留言。