leetcode19删除链表的倒数第N个节点(C语言版)

本文详细介绍了使用C语言实现从链表中删除倒数第N个节点的方法,包括如何遍历链表计算长度,定位待删除节点,并进行节点删除操作。通过具体的代码示例,展示了main函数中链表的创建、删除操作及结果输出过程。

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

在自己的main函数下通过的代码片段:

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

struct ListNode {

   
int val;

   
struct ListNode *next;

};

struct ListNode* removeNthFromEnd(struct
ListNode* head, int n)

{

   
int cout=0,i=0;

   
struct ListNode *node,*p,*h;

   
h=p=head;

   
while(h->next!=NULL)

    {

       
cout++;

       
h=h->next;

    }

   
if(cout==0)

    {

       
p=p->next;

       
head->next=NULL;

    }

   
while(head->next!=NULL)

    {

       
if(i==cout-n)

       
{

           
if(i!=0)

           
{

          
     node->next=head->next;

                head=node;

                break;

           
}

           
else if(i==0)

           
{

                p=p->next;

                break;

           
}

       
}

       
node=head;

       
i++;

       
head=head->next;

    }

   
return p;

}

main函数:



int main()

{

   
struct ListNode *p,*head,*l,*head2;

   
int n;

   
p=(struct ListNode*)malloc(sizeof(struct ListNode*));

   
head=p;

   
p->val=0;

   
p->next=NULL;

   
do

    {

       
scanf("%d",&p->val);

        l=(struct ListNode*)malloc(sizeof(struct
ListNode*));

       
l->val=0;

       
l->next=NULL;

       
p->next=l;

       
p=p->next;

   
}while(getchar()!='\n');

   
scanf("%d",&n);

   
head2=removeNthFromEnd(head,n);

   
while(head2->next!=NULL)

    {

       
printf("%d",head2->val);

       
head2=head2->next;

    }

   
return 0;

}


在leetcode中通过的代码片段:



/**

 *
Definition for singly-linked list.

 *
struct ListNode {

 *    
int val;

 *    
struct ListNode *next;

 * };

 */

struct ListNode* removeNthFromEnd(struct
ListNode* head, int n)

{

   
int cout=1,i=0;

   
struct ListNode *node,*p,*h;

   
h=p=head;

   
while(h->next!=NULL)

    {

       
cout++;

       
h=h->next;

    }

   
if(cout==1)

    {

       
p=p->next;

       
head=NULL;

    }

   
while(head!=NULL)

    {

       
if(i==cout-n)

       
{

           
if(i!=0)

           
{

                node->next=head->next;

                head=node;

                break;

           
}

           
else if(i==0)

           
{

                p=p->next;

                break;

           
}

       
}

       
node=head;

       
i++;

       
head=head->next;

    }

   
return p;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值