目录链接:
力扣编程题-解法汇总_分享+记录-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;
}
};