刷题记录——链表删除

108 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

1、删除有序链表中的重复元素I

1、原题简述

[](删除有序链表中重复的元素-I_牛客题霸_牛客网 (nowcoder.com))

删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为{1,1,2,2},返回{1,2}.
给出的链表为{1,1,2,2,3,3,3,3}返回{1,2,3}

数据范围:链表长度满足1000≤n≤100,链表中任意节点的值满足 |val| ≤100

进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

2、源代码

struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    struct ListNode *l,*p;
    p=(struct ListNode*)malloc(sizeof(struct ListNode));
    l=head;
    int i=0;
    while(l!=NULL)
    {
        if(l->val==l->next->val&&l->next!=NULL)//如果当前节点的数据区域与下一节点的数据域相同,就删除下一节点
        {
            p=l->next;
            l->next=p->next;
            i=1;
        }
        else {
            l=l->next;//如果不相同就后移一位
        }
    }
    return head; 
}

image.png

2、删除有序链表中的重复元素II

1、原题简述

[](删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder.com))

给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为{1,1,2,3,3,4,4,5},返回{2,5}.
数据范围:链表长度 100000≤n≤10000,链表中的值满足∣val∣≤1000

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

2、源代码

struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if(head==0)    return 0;//head==0是几个意思????head==NULL????
    //不为空结点
    
    struct ListNode* np=(struct ListNode*)malloc(sizeof(struct ListNode));
    np->next=head;//设置一个头节点
    
    struct ListNode* p0=np;struct ListNode* p1=head;
    //p0为有头链表
    //p1为无头链表
    int count=0;
    while(p1!=0){//p1!=NULL????
        count=0;
        while(p0->next->val==p1->val&&p1!=0){
            p1=p1->next;count++;
        }
        if(count==1)    p0=p0->next;
        p0->next=p1;
    }
    return np->next;
}

一轮循环以后,原本p0,p1黑色的那两个变成的红色的位置,会发现1,1被挑选出来。继续循环下去,最后返回np->next就OK了。 image.png