删除链表中的重复元素
描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路和代码
pre指向没有重复的最后一个元素,判断
- 若当前元素==pre->val,证明这是个重复元素
- 若当前元素不等于pre,则可以插入pre后面
本题是排好序的链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL || head->next==NULL)
return head;
ListNode* h = head->next;
ListNode* pre = head;
while(h != NULL)
{
if(h->val == pre->val)
h = h->next;
else
{
pre->next = h;
pre = h;
h = h->next;
}
}
pre->next = NULL;
return head;
}
};
更简洁的代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* p = head;
while(p!=NULL && p->next!=NULL)
{
if(p->val == p->next->val)
p->next = p->next->next;
else
p = p->next;
}
return head;
}
};
删除链表中的重复元素2
描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* cur = head;
ListNode* pre = dummy;
while(cur!=NULL && cur->next!=NULL)
{
bool equal = false;
while(cur->next!=NULL && cur->val==cur->next->val)
{
cur = cur->next;
equal = true;
}
if(equal)
{
pre->next = cur->next;
equal = false;
}
else
pre = cur;
cur = cur->next;
}
return dummy->next;
}
};