2022年6月24日leetcode每日一题打卡——83.删除排序链表中的重复元素

一、题目描述与要求

83. 删除排序链表中的重复元素 - 力扣(LeetCode)

题目描述

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

示例

示例1:

2022年6月24日leetcode每日一题打卡——83.删除排序链表中的重复元素_第1张图片

输入:head = [1,1,2]
输出:[1,2]

 示例2:

2022年6月24日leetcode每日一题打卡——83.删除排序链表中的重复元素_第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;
}

你可能感兴趣的:(leetcode刷题,链表,leetcode,数据结构,c语言,算法)