牛客-c语言刷题-删除链表的倒数第n个节点

题目连接:

删除链表的倒数第n个节点_牛客题霸_牛客网 (nowcoder.com)

题目描述:

描述

给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,

给出的链表为: 1→2→3→4→5 ,  n=2.
删除了链表的倒数第  n 个节点之后,链表变为1→2→3→5 

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

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

题目保证  n 一定是有效的

题目解法:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*
 *BM8 链表中倒数最后k个结点
描述
    给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,
    给出的链表为: 1→2→3→4→5, n=2.
    删除了链表的倒数第 n 个节点之后,链表变为 1→2→3→5.

数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足 0≤val≤100
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
备注:
题目保证 n 一定是有效的

*/

/**************************code*****************************************/
struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode* removeNthFromEnd(struct ListNode* head, int n ) {
    // write code here
    struct ListNode *pfast, *pslow;
    struct ListNode *dummyHead = (struct ListNode *)malloc(sizeof(struct ListNode));
    dummyHead->next = head;
    pfast = dummyHead, pslow = dummyHead;   //创建虚拟头节点,并且fast slow都指向dummy

    for(int i=0; i<=n; i++){    //找到fast位置,注意此时slow和fast距离n+1
        if(!pfast)return NULL;
        pfast = pfast->next;
    }

    while(pfast){               //当fast没到末尾时,fast slow一起移动
        pfast = pfast->next;
        pslow = pslow->next;
    }
    //fast找到末尾时,slow在要删除的节点的前一个(前面的n+1),将slow的next指向next->next,跳过倒数n节点。
    pslow->next = pslow->next->next;    
    return dummyHead->next;
}

/**************************end******************************************/

int main ()
{
    struct ListNode LN15={5,NULL};
    struct ListNode LN14={4,&LN15};
    struct ListNode LN13={3,&LN14};
    struct ListNode LN12={2,&LN13};
    struct ListNode LN1 ={1,&LN12};

    struct ListNode LN22 ={2,NULL};
    struct ListNode LN2  ={1,&LN22};

    struct ListNode* ret = removeNthFromEnd(&LN1, 2);
    while(ret){   
        printf("-*--    %d \r\n", ret->val);
        ret = ret->next;
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值