【链表】LeetCode82.删除排序链表中的重复元素||

294 阅读1分钟

题目

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况
的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。

示例

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

代码实现

主要思路

  1. 首先题目要求删除所有重复元素,并不是保留一个重复元素
  2. 创建一个虚拟头结点来构建新链表
  3. 然后遍历原链表,当前节点值不等于下一个节点值,才将当前节点加到新链表
  4. 如果当前节点值等于下一个节点值,通过循环不断的更新当前节点
    public ListNode deleteDuplicates(ListNode head) {
        //链表为null或者只有一个节点
        if(head == null || head.next == null){
            return head;
        }
        ListNode dummmty = new ListNode();
        ListNode tail = dummmty;
        while(head != null){
            //此时head.next == null,说明head可能是最后一个节点
            if(head.next == null || head.val != head.next.val){
                //加入到新链表中
                tail.next = head;
                tail = tail.next;
            }
            //此时说明有重复元素,不断更新head
            while(head.next!= null && head.val == head.next.val){
                head = head.next;
            }
            //循环完毕,此时head指向重复元素中的最后一个元素
            //然后更新head,指向不是重复元素
            head = head.next;
        }
        tail.next = null;
        return dummmty.next;
    }