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 }
说明:
1、考虑到原头指针 head 可能为重复元素而被删除的情况,添加虚拟头结点 dummy;
2、遍历链表,定义2个指针,分别指向当前 p 、前一个 q ,后一个的话就是 p.next 不用特别定义;
3、考虑到重复元素都要被删除的情况,添加布尔值 isDuplicate ,标记重复元素,在出现后一个值与当前值不同的情况下,判断当前元素是否被标记,如果标记了,则利用记录的前一个指针 q 将其删除,继续遍历;
注意:列表尾部的处理