LeetCode - 82、删除排序链表中的重复元素 II

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

示例 1:

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


示例 2:

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

1 /**
2  * 列表定义
3  * public class ListNode {
4  *     int val;
5  *     ListNode next;
6  *     ListNode(int x) { val = x; }
7  * }
8  */

解法:

 1 class Solution {
 2     public ListNode deleteDuplicates(ListNode head) {
 3         ListNode dummy = new ListNode(0);
 4         dummy.next = head;
 5         ListNode p = head, q = dummy;
 6         boolean isDuplicate = false;
 7         while (p != null) {
 8             if (p.next != null && p.next.val == p.val) {
 9                 isDuplicate = true;
10                 p.next = p.next.next;
11             } else {
12                 p = p.next;
13                 if (isDuplicate) {
14                     // 此时删除当前q.next,q不需要动
15                     q.next = p;
16                     isDuplicate = false;
17                 } else {
18                     // 此时p和q 都要前进1
19                     q = q.next;
20                 }
21             }
22         }
23         return dummy.next;
24     }
25 }
View Code

说明:

1、考虑到原头指针 head 可能为重复元素而被删除的情况,添加虚拟头结点 dummy;

2、遍历链表,定义2个指针,分别指向当前 p 、前一个 q ,后一个的话就是 p.next 不用特别定义;
3、考虑到重复元素都要被删除的情况,添加布尔值 isDuplicate ,标记重复元素,在出现后一个值与当前值不同的情况下,判断当前元素是否被标记,如果标记了,则利用记录的前一个指针 q 将其删除,继续遍历;
注意:列表尾部的处理

 

posted on 2019-08-29 14:08  可乐加冰、  阅读(125)  评论(0编辑  收藏  举报