【LeetCode-口试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】

【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】

【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】


【LeetCode-面试算法经典-Java实现】【所有题目目录索引】

原题

  Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
  For example,
  Given 1->2->3->3->4->4->5, return 1->2->5.
  Given 1->1->1->2->3, return 2->3.

题目大意

  给定一个排好序的单链表,删除所有重复的元素。只留下只有一个值的元素。

解题思路

  给链表接上一个辅助结点root,root接到原来的头部,引用这个头部和辅助的指针,对重重的元素进行删除。

代码实现

算法实现类

public class Solution {
    public ListNode deleteDuplicates(ListNode head) {

        ListNode root = new ListNode(0); // 头结点
        root.next = head;
        ListNode p = head;
        ListNode q = root; // 记录最后一个没有重复的元素,开始指向头结点

        int delta = 0; // 元素重复个数

        while (p != null && p.next != null) {
            if (p.val == p.next.val) { // 如果相邻两个数相同
                delta++;
                p = p.next; // 移动到下一个结点
            } else { // 如果相邻两个结点不相同
                if (delta == 0) { // 值为p.val的结点没有重复
                    q.next = p; // 链接到没有复的元素
                    q = p; // 指向最后一个未重复的元素
                    p = p.next; // 移动到下一个结点
                } else { // 值为p.val的结点有重复
                    p = p.next; // 移动到下一个元素
                    q.next = p.next; // 去掉重复的元素
                    delta = 0; // 元素重复个数设置为0
                }
            }
        }

        if (delta != 0) { // 如果最后一个元素是复的就去掉
            q.next = null;
        } else { // 如果没有重复就开链接到表尾
            q.next = p;
        }

        return root.next;
    }
}

评测结果

  点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。

【LeetCode-口试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】

特别说明

欢迎转载,转载请注明出处【http://blog.csdn.net/derrantcm/article/details/47270973】

版权声明:本文为博主原创文章,未经博主允许不得转载。