C语言力扣刷题4——删除链表的倒数第 N 个结点[双指针],只遍历一遍

力扣刷题4——删除链表的倒数第 N 个结点[双指针]

一、博客声明

  找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来记录。代码可能不是自己写的,不求方法最好,只求更多地理解大佬们的解题思路。


二、题目描述

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1
在这里插入图片描述

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2
输入:head = [1], n = 1
输出:[]

示例 3
输入:head = [1,2], n = 1
输出:[1]

提示
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz


三、解题思路

1、思路说明

  这题使用双指针的方法来解决, 就只需要遍历一次链表,就能找到要找的位置进行删除。在这个过程中我们有delend指针,遍历的时候,用whileend一直要遍历到最后一个节点,而我们只需要做的是,保证delend之间存在n间隔就可以。while结束后,直接del->next = del->next->next解决。
在这里插入图片描述


四、解题代码(附注释)

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    struct ListNode* preHead = malloc(sizeof(struct ListNode));//建立一个检测头
    preHead->val = 0; 
    preHead->next = head;
    struct ListNode* del = preHead;//要删除的位置前一个位置指针
    struct ListNode* end = preHead;//跑到链表最后位置的指针
    int count = 0;
    if(head->next == NULL){//如果链表只有一个节点,直接返回NULL
        return NULL;
    }

    while(end->next){//一直循环到链表最后的位置
        end = end->next;
        count++;
        if(count > n){//当del与end间隔n的时候,del也开始移动,与end保持n的间隔
            del = del->next;
        }
    }
    del->next = del->next->next;//删除指定节点
    struct ListNode* result = preHead->next;//新建result指向头
    free(preHead);//释放分配的内存
    return result;
}
  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值