用JavaScript刷leetcode第82题- 删除排序链表中的重复元素 II

181 阅读1分钟

前言

一次遍历即可完成。但是注意删除节点的操作,找得是待删除节点前一个节点

一、题目描述:

  • 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
  • 返回同样按升序排列的结果链表。
  • 示例:
输入: head = [1,2,3,3,4,4,5]
输出: [1,2,5]

二、解题

2.1 思路:

  • 指针 cur 指向 待处理节点的上个节点
  • cur.next 指向 待处理节点
  • cur.next.next 指向 待处理节点下一节点
  • 比较的是待处理节点和待处理的下一个节点,需要待处理节点的上一个节点是因为需要做删除重复元素操作

2.2 代码

这个代码几乎每行都有注释了,如果说指望奶会,劝趁早放弃。
git代码地址

/**
 * 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}
 */


// cur 待处理节点前一个节点, 
// cur.next 待处理节点
// cur.next.next 待处理节点下一节点
const deleteDuplicates = function(head) {
  // 虚头,因需要操作头节点的前一个节点
  let dummy = new ListNode(-1, head)

  // cur 指向待处理节点前一个节点
  let cur = dummy

  while(cur.next && cur.next.next) {
    // 待处理节点 与 待处理下一节点比较
    if(cur.next.val !== cur.next.next.val) {
      // 不相等,待处理节点前一节点往后移一位
      cur = cur.next
    } else {
      // 相等,记录待处理节点值
      let val = cur.next.val

      // 找到不相等的节点,相等的节点删掉
      while(cur.next  && cur.next.val === val ) {
        cur.next = cur.next.next
      }
    }
  }

  return dummy.next
}