/**
* 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
*
* 示例 1:
* 输入: 1->2->3->3->4->4->5
* 输出: 1->2->5
* 示例 2:
* 输入: 1->1->1->2->3
* 输出: 2->3
* };
*/
class Solution {
struct ListNode {
ListNode*next;
int val;
ListNode(int n):val(n),next(NULL){}
};
public:
ListNode *deleteDuplicates(ListNode *head) {
if (!head || !head->next) return head;
ListNode *start = new ListNode(0);
start->next = head;
ListNode *pre = start;
while (pre->next) {
ListNode *cur = pre->next;
while (cur->next && cur->next->val == cur->val)
{
cur = cur->next;
}
if (cur != pre->next) {
//from 重复元素的开始位置,to 重复元素的下一个位置
ListNode*from = pre->next;
ListNode*to = cur->next;
//断开连接
pre->next = cur->next;
//删除重复值
while (from!= to) {
ListNode*tmp = from;
from = from->next;
delete tmp;
}
}
else {
pre = pre->next;
}
}
return start->next;
}
};
/**
*给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
*示例 1:
*输入: 1->1->2
*输出: 1->2
*
*示例 2:
*输入: 1->1->2->3->3
*输出: 1->2->3
*/
class Solution {
struct ListNode {
ListNode*next;
int val;
ListNode(int n) :val(n), next(NULL) {}
};
public:
ListNode *deleteDuplicates(ListNode *head) {
if (!head || !head->next) return head;
ListNode *start = head;
while (start && start->next) {
if (start->val == start->next->val) {
ListNode *tmp = start->next;
start->next = start->next->next;
delete tmp;
}
else start = start->next;
}
return head;
}
};
删除链表的重复元素
猜你喜欢
转载自blog.csdn.net/mrbaolong/article/details/104392897
今日推荐
周排行