一、题目描述与要求
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
- 题目数据保证链表已经按升序 排列
二、解题思路
总的思路:
要删除链表中重复的元素,而且链表是有序的,则从第一的结点开始对链表进行遍历。将目前指向的结点的值与下一个结点的值相比较,如果相同则改变指针,让此结点的下一位指向原本的下一位的下一位,也就是舍弃了重复的那个结点;如果不相等则让指针指向下一个结点继续进行比较,最后返回head。
具体步骤:
1、判断链表是否为空,为空直接返回head
2、定义工作指针cur,指针类型为结点类型
3、以cur->next不为空为循环标志,意味着未访问到最后一位
4、对结点与下一个结点的值进行比较,相同则删去,不同则访问下一个结点
5、返回head
三、具体代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
if(!head)//如果链表为空直接返回空
{
return head;
}
struct ListNode* cur=head;//定义工作指针cur
while(cur->next)//当链表非空
{
if(cur->val==cur->next->val)//如果cur的值等于后继的值则让cur的next指向下一个的下一个
{
cur->next=cur->next->next;
}
else//否则继续访问下一个进行遍历
{
cur=cur->next;
}
}
return head;
}