题目
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3] 输出:[2,3]
C++代码
#include <iostream>
using namespace std;
//定义链表结构体
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) {}
};
/*
* 删除排序链表中的重复节点问题
* 定义dummyNode哑节点和cur节点
* 判断cur->next和cur->next->next节点不为空
* while循环删除重复节点和节点本身
*/
ListNode* deleteDuplicates(ListNode* head) {
if (!head) {
return head;
}
ListNode* dummyNode = new ListNode(0, head);
ListNode* cur = dummyNode;
while (cur->next && cur->next->next) {
if (cur->next->val == cur->next->next->val) {
int x = cur->next->val;
while (cur->next && cur->next->val == x) {
cur->next = cur->next->next;
}
}
else {
cur = cur->next;
}
}
ListNode* ans = dummyNode->next;
delete dummyNode;
return ans;
}
int main() {
ListNode* n1 = new ListNode(1);
ListNode* n2 = new ListNode(2);
ListNode* n3 = new ListNode(3);
ListNode* n4 = new ListNode(3);
ListNode* n5 = new ListNode(4);
ListNode* n6 = new ListNode(4);
ListNode* n7 = new ListNode(5);
n1->next = n2;
n2->next = n3;
n3->next = n4;
n4->next = n5;
n5->next = n6;
n6->next = n7;
n7->next = nullptr;
ListNode* head = n1;
ListNode* ans = deleteDuplicates(head);
while (ans) {
cout << ans->val << " ";
ans = ans->next;
}
delete n1, n2, n3, n4, n5, n6, n7;
return 0;
}
分析
删除排序链表中的重复节点问题,定义 dummyNode 哑节点和 cur 节点,判断 cur->next 和 cur->next->next 节点不为空,while 循环删除重复节点和节点本身。
问题
本来想加一个pre节点增加代码可读性,但是写出来超时了,不知道什么问题。