持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
一、题目描述:
83. 删除排序链表中的重复元素 - 力扣(LeetCode)
给定一个已排序的链表的头
head, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
- 链表中节点数目在范围 [0, 300] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
二、思路分析:
通过快慢指针求解,要注意的是链表中必须有两个或两个以上的值才能进行操作,若头指针为空和仅一个数则直接返回头指针,若不是则用双指针,一个指针等于头指针作为慢指针,再将另一个指针指向头指针的下一个数据作为快指针,进行循环若快指针指向空则结束(快指针指针域为空时最后一个数据并为进行判断,所以循环结束后还要加一个对最后一个数据的判断),循环中判断快指针数据域数值是否与慢指针数据域数值相同,若不相同则慢指针指针域指向快指针所在位置,再慢指针等于快指针,从而达到将不同数据排列的目的,最后再将慢指针指针域置空。
三、AC 代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
struct ListNode *s,*r;
if(head==NULL||head->next==NULL)
return head;
else {
r=head->next;
s=head;
while (r->next!=NULL){
if(s->val!=r->val) {
s->next=r;
s=r;
}
r=r->next;
}
if(s->val!=r->val){
s->next=r;
s=r;}
s->next=NULL;
return head;}
}