1. 题目描述

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

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

示例 2:

  1. 输入: 1->1->1->2->3
  2. 输出: 2->3

2. 解题思路

在删除节点时,需要把节点的前驱结点和后驱节点都删除掉。我们想要获取一个节点的前驱节点,就需要设置一个虚拟的头结点来实现,虚拟的头结点指向真正的头结点,这样就确保每个节点都有前驱结点。

需要注意的是,重复的节点可能不只有两个,所以,我们还需要往后验证,反复进行判断和删除操作,直到没有重复的元素为止。

3. 代码实现

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {ListNode}
  11. */
  12. var deleteDuplicates = function(head) {
  13. // 处理链表只有0或1个节点的情况
  14. if(!head||!head.next){
  15. return head
  16. }
  17. // 设置虚拟头节点
  18. let dummy = new ListNode()
  19. dummy.next = head
  20. // 设置当前节点
  21. let cur = dummy
  22. while (cur.next &&cur.next.next){
  23. if(cur.next.val === cur.next.next.val){
  24. // 保存重复节点的值
  25. let val =cur.next.val
  26. // 反复判断是否还有相等的节点
  27. while(cur.next &&cur.next.val === val)
  28. {
  29. cur.next = cur.next.next
  30. }
  31. }else{
  32. cur = cur.next
  33. }
  34. }
  35. // 返回最终结果,也就是链表的起始的节点
  36. return dummy.next
  37. };

4. 提交结果

82. 删除排序链表中的重复元素 II - 图1