Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

0%

# Leetcode 83 删除排序链表中的重复元素 ( Remove Duplicates from Sorted List *Easy* ) 题解分析

发表于 2022-03-13 分类于 Java ， leetcode 阅读次数： 阅读次数： Disqus：
给定一个已排序的链表的头 `head` ， 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。

### 题目介绍

给定一个已排序的链表的头 `head` ， 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。
PS：注意已排序，还有返回也要已排序

#### 示例 1：

> 输入：head = [1,1,2]
> 输出：[1,2]

#### 示例 2：

> 输入：head = [1,1,2,3,3]
> 输出：[1,2,3]

### 提示：

- 链表中节点数目在范围 `[0, 300]` 内
- `-100 <= Node.val <= 100`
- 题目数据保证链表已经按 升序 排列

### 分析与题解

这题其实是比较正常的 easy 级别的题目，链表已经排好序了，如果还带一个排序就更复杂一点，
只需要前后项做个对比，如果一致则移除后项，因为可能存在多个重复项，所以只有在前后项不同
时才会更新被比较项

#### code

    public ListNode deleteDuplicates(ListNode head) {
        // 链表头是空的或者只有一个头结点，就不用处理了
        if (head == null || head.next == null) {
            return head;
        }
        ListNode tail = head;
        // 以处理节点还有后续节点作为循环边界条件
        while (tail.next != null) {
            ListNode temp = tail.next;
            // 如果前后相同，那么可以跳过这个节点，将 Tail  ---->   temp  ---> temp.next
            // 更新成  Tail ---->  temp.next
            if (temp.val == tail.val) {
                tail.next = temp.next;
            } else {
                // 不相同，则更新 tail
                tail = tail.next;
            }
        }
        // 最后返回头结点
        return head;
    }

链表应该是个需要反复的训练的数据结构，因为涉及到前后指针，然后更新操作，判空等，
我在这块也是掌握的不太好，需要多练习。