82. 删除排序链表中的重复元素 II(JS实现)

1 题目

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3

2 思路

这道题的思路主要思路还是双指针,prev指针上一个元素,head指针遍历每个元素,当prevhead指向的元素值不同时,两者同时向后移动,当prevhead指向的元素值相同时,此时说明出现重复元素,那么prev指针不动,head指针继续向后搜索直到找到不同的元素,然后修改指针指向,将重复元素段移除。

3代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
  if (!head || !head.next) return head;

  let linkHead = head;
  let prev = head;
  head.prev = null;
  let flag = false;

  while (head.next) {
    head.next.prev = head;
    head = head.next;
    if (head.val === prev.val) {
      if (!flag) {
        flag = true;            //打开开关,开始寻找下一个值不同的元素
      };
    } else {
      if (flag) {   //找到不同值的元素,修改指针
        if (!prev.prev) {   //如果重复的是列表头元素
          linkHead = head;
          head.prev = null;
        } else {                 //如果重复的元素位于列表中间
          prev.prev.next = head;
          head.prev = prev.prev;
        }
        flag = false;    //关闭开关,继续寻找相同的元素
      }
      prev = head;
    }
  }

  if (flag) {     //如果重复元素段在链表尾部
    if (!prev.prev) {  
      linkHead = null;
    } else {                 
      prev.prev.next = null;
    }
  }

  return linkHead;
};

猜你喜欢

转载自blog.csdn.net/zjw_python/article/details/106816879