目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:. - 力扣(LeetCode)
描述:
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3] 输出:[2,3]
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
解题思路:
设置三个指针,分别代表头节点,筛选后链表的最后一个节点,以及未筛选链表的上一个节点。
遍历链表,如果为空,则记录为链表的上一个节点。
如果不为空,则判断值是否等于上一个节点。
如果等于,则num+1。
如果不等于,则说明读到了一个新的节点,需要判断是否是重复的节点。num>1代表重复,也跳过。如果num=1,则需要把节点插入到筛选后的链表中。
代码:
class Solution {
public:void action(int &num, ListNode *&header, ListNode *&tail, ListNode *&last, ListNode *&node){if (num > 1){num = 1;last = node;return;}// 需要插入,则先插入,然后添加记录新节点if (header == nullptr){header = last;tail = last;}else{tail->next = last;tail = last;}if (node == nullptr){return;}num = 1;last = node;tail->next = nullptr;}ListNode *deleteDuplicates(ListNode *head){int num = 0;// 头节点ListNode *header = nullptr;// 筛选后的节点后最后一个ListNode *tail = nullptr;// 最后一个记录的节点ListNode *last = nullptr;while (head != nullptr){ListNode *node = head;head = head->next;// 第一个节点时if (last == nullptr){num = 1;last = node;continue;}// 当前节点和上一个节点是一样的if (node->val == last->val){num++;continue;}// 不一样,则判断是需要插入,还是抛弃,num>=1是抛弃action(num, header, tail, last, node);}ListNode *end = nullptr;action(num, header, tail, last, end);return header;}
};