给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
代码①:逐位比较并移动
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head) {
struct 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;
}
代码②:递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//递归
struct ListNode* deleteDuplicates(struct ListNode* head) {
if( head==NULL || head->next==NULL )
return head;
head->next = deleteDuplicates(head->next);
return (head->val == head->next->val) ? head->next : head;
}
代码③:快慢指针
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//快慢指针
struct ListNode* deleteDuplicates(struct ListNode* head) {
if( head == NULL )
return head;
struct ListNode *slow=head, *fast=head->next;
while( fast != NULL )
{
if( slow->val == fast->val )
{
fast = fast->next; //slow指针指向相等元素之后的下一个元素
slow->next = fast;
}
else
{
slow = slow->next;
fast = fast->next;
}
}
return head;
}