81. 删除排序链表中的重复元素
题目描述:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2 输出: 1->2
示例 2:
输入: 1->1->2->3->3 输出: 1->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* p1=head;
ListNode* p2=head->next;
while(p2){
if(p1->val==p2->val){
ListNode* p=p2;
p1->next=p2->next;
free(p);
p2 = p2->next;
}
else{
p1=p1->next;
p2=p2->next;
}
}
return head;
}
};
82.
题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
思路:这道题需要把重复的值都删了。解题思路还是使用两个相邻指针p1和p2,如果p1和p2指向的值相同,那么p2继续往前走,知道找到不相同的值,这样区间p1和p2之间的就都是相同的数了,然后从p1开始删除这些重复的值,一直删除到p2,然后p1指向p2的位置,p2继续往前走。如果说p1和p2不相同,那么就都继续往前走。这里需要注意的是,在实现的时候,需要始终有一个节点指向p1前面的位置,这样才能删除。所以,一个编程tips:可以新建一个节点指向头节点,然后定义一个指针始终在p1之前即可。
代码:
/**
* 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* p1=head;
ListNode* p2=head->next;
ListNode* tempHead=new ListNode(-1);
tempHead->next=head;
ListNode* pre=tempHead;
while(p2){
if(p1->val==p2->val){
p2=p2->next;
}
else{//判断是否需要删除
if(p1->next != p2){
while(p1!=p2){
ListNode* p=p1;
pre->next=p1->next;
free(p);
p1=pre->next;
}
p2=p2->next;
}
else{//不需要删除
pre=pre->next;
p1=p1->next;
p2=p2->next;
}
}
}
if(p2==NULL && p1->next!=p2){
while(p1!=p2){
ListNode* p=p1;
pre->next=p1->next;
free(p);
p1=pre->next;
}
}
return tempHead->next;
}
};