题目链接:
题目:
给定一个已排序的链表的头 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;
- 题目数据保证链表已经按升序 排列;
思路:
这是LeetCode中的一道中等难度的链表题。
首先读题,题目要求我们去掉排序后的链表节点中重复的元素。
那首先定义一个n_head节点来连接head后面非重复元素的节点。再定义一个链表指针last指向n_head和链表指针now指向head节点
接着循环寻找非重复元素的节点。当now节点指向NULL时跳出循环。在循环中,若now的val值等于now节点下一个结点的val值且不指向NULL时循环让now指针指向now的下一个节点。跳出循环后让last的next指向tail的下一个节点,now指向tail的下一个节点,tail指向tail的下一个节点,然后重新开始循环。
若now的val值不等于now节点下一个结点的val值,则让last指针指向now,now指针指向now指针的下一个。
最后返回n_head指向的下一个节点地址即可。
AC代码:
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr) {
return head;
}
ListNode* d_head = new ListNode(0);
d_head->next = head;
ListNode* now = d_head->next;
ListNode* tail;
ListNode* last = d_head;
while (now != nullptr && now->next != nullptr) {
if (now->val == now->next->val) {
tail = now;
while (tail->next != nullptr && tail->val == tail->next->val) {
tail = tail->next;
}
last->next = tail->next;
now = tail->next;
tail = tail->next;
continue;
}
last = now;
now = now->next;
}
return d_head->next;
}
};
如果我的文章对你有所帮助,不妨给我个关注何点赞吧。