刷题日记【模板】链表练习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


题目

在这里插入图片描述

思路

需要识别insert和delete,其余部分为链表基础

一、函数部分

1.search和print

search用于定位于需要的节点前面一位;
print用于最后打印出答案;

void print(ListNode* head){
    ListNode* cur=head;
    if(cur==NULL)
        printf("NULL");
    while(cur){
        printf("%d ",cur->data);
        cur=cur->next;
    }
}

void search(ListNode* head,ListNode** p,int x){
ListNode* cur=head;
while(cur->next){
    if(cur->next->data==x){
        *p=cur;
        return;
    }
    cur=cur->next;
}

2.insert和delete

insert函数先用search定位,之后在对链表插入;
delete函数原理相同,先定位,再删除;
两个函数都要考虑特殊情况,如空链表;

void insert(ListNode* head,int x,int y){
    ListNode* prev=NULL;
    search(head,&prev,x);

    ListNode* newnode=(ListNode*)malloc(sizeof(ListNode));
    newnode->data=y;
    newnode->next=prev->next;
    prev->next=newnode;
}

void delete(ListNode* head,int x){
    ListNode* prev=NULL;
    search(head,&prev,x);

    if(prev==NULL||prev->next==NULL)
        return;
    else if(prev->next!=NULL){
        ListNode* next=prev->next->next;
        free(prev->next);
        prev->next=next;
    }
}

二、主函数

用strcmp函数可以确定使用insert还是delete;
这里链表是带头的,所以print函数用head-next;

int main() {
    int n,x,y;
    char s[10];
    scanf("%d",&n);
    ListNode* head=(ListNode*)malloc(sizeof(ListNode));
    head->next=NULL;
    while(n--){
        scanf("%s",&s);
        if(strcmp(s,"insert")==0){
            scanf("%d%d",&x,&y);
            insert(head,x,y);
        }else if(strcmp(s,"delete")==0){
            scanf("%d",&x);
            delete(head,x);
        }
    }

    print(head->next);
    return 0;
}

总结

今天在牛客上看到的模板题,算是对于链表的巩固,前两天开始学链表,开始练手,链表更多的是使用带头双向循环链表,我还在熟悉中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值