首页 > 编程语言 > 详细

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

时间:2019-08-29 14:15:14      阅读:87      评论:0      收藏:0      [点我收藏+]

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

示例 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         ListNode del = new ListNode(0);
 7         boolean isDuplicate = false;
 8         while (p != null) {
 9             if (p.next != null && p.next.val == p.val) {
10                 isDuplicate = true;
11                 // 利用del进行垃圾处理
12                 del = p.next;
13                 p.next = p.next.next;
14                 del = null;
15             } else {
16                 p = p.next;
17                 if (isDuplicate) {
18                     // 此时删除当前q.next,q不需要动
19                     del = q.next;
20                     q.next = p;
21                     del.next = null;
22                     isDuplicate = false;
23                 } else {
24                     // 此时p和q 都要前进1
25                     q = q.next;
26                 }
27             }
28         }
29         return dummy.next;
30     }
31 }
View Code

说明:

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

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

 

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

原文:https://www.cnblogs.com/dkccc/p/11429388.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!