LeetCode(203)

本文详细解析了一种用于移除链表中特定值元素的算法实现,通过创建临时头节点简化操作,确保了边界条件的正确处理。文章提供了完整的C语言代码示例,包括链表的插入、遍历及移除元素功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
在这里插入图片描述
通过的代码

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode *p,*p_prior;
    struct ListNode *head_temp=(struct ListNode *)malloc(sizeof(ListNode));
    /*新开一个结点啊。作为链表的新头结点。不新开头结点的话,挺麻烦的。
    如果只是
    p_prior=head;
    p=head;
    这样也能通过一半的用例,但是如果val为1吧,【1,1】的时候就会出错,输出是【1】,其实应该是【】才对。还有【1】的输出也为【1】。
    */
    head_temp->next=head;
    p_prior=head_temp;
    p=head;
    while(p!=NULL)
    {
        if(p->val==val)
        {
           p_prior->next=p->next;
           p=p_prior->next;
        }
        else
        {
           p_prior=p;
           p=p->next;
        }
    }
    return head_temp->next;
}

提交结果
在这里插入图片描述

完整代码:

#include <stdio.h>
#include <algorithm>
struct ListNode
{
    int val;
    struct ListNode *next;
};

typedef struct ListNode LNode;
typedef struct ListNode *LNode_Pointer;
struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode *p,*p_prior;
    struct ListNode *head_temp=(struct ListNode *)malloc(sizeof(ListNode));
    //新开一个结点啊。作为链表的新头结点
    head_temp->next=head;
    p_prior=head_temp;
    p=head;
    while(p!=NULL)
    {
        if(p->val==val)
        {
           p_prior->next=p->next;
           p=p_prior->next;
        }
        else
        {
           p_prior=p;
           p=p->next;
        }
    }


    return head_temp->next;
}



void Tail_Insert_List(LNode_Pointer &head,LNode_Pointer &tail,int val)//&tail。不加&的话每次的tail的值还是head的值
{
    LNode_Pointer q=(LNode_Pointer)malloc(sizeof(LNode));
    if(tail!=NULL)
    {
        q->val=val;
        tail->next=q;
        tail=tail->next;
        tail->next=NULL;
    }
    else
    {
        q->val=val;
        tail=q;
        tail->next=NULL;
        head=tail;//注意这里。不这样的话主函数的head仍然是0。
    }


}
void printf_List(LNode_Pointer p)
{
    while(p!=NULL)
    {
        if(p->next!=NULL)
        {
           printf("%d(地址=%p)->",p->val,p);
           //printf("%d->",p->val,p);
           p=p->next;
        }
        else
        {
           printf("%d(地址=%p)",p->val,p);
           //printf("%d",p->val,p);
           p=p->next;
        }
    }
}



int main()
{
    int val;
    LNode_Pointer head=(LNode_Pointer)malloc(sizeof(LNode));
    head=NULL;
    LNode_Pointer tail=(LNode_Pointer)malloc(sizeof(LNode));
    tail=head;
    while(scanf("%d",&val)!=EOF)
    {
        Tail_Insert_List(head,tail,val);
    }

    printf_List(head);

    printf("\n");

    LNode_Pointer head_return=removeElements(head,6);
    printf_List(head_return);

    return 0;
}

本地运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值