删除链表的倒数第 N 个结点(力扣题目)

目录

1.题目

2.思路

3.图解

4.代码


1.题目

给你一个链表,删除链表的倒数第 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]

2.思路

这道题可以先遍历一遍,得到链表中的节点个数,然后在计算出要删除的节点的位置,从而删除该节点。也可以只遍历一遍,做法有点像找中间节点的题目,先定义快慢指针都指向链表头(slow 和 fast),先让fast走n步,然后fast和slow同时往前走,直到fast为空,这时slow指向的节点就是要删除的节点,然后删除该节点就可以了。

3.图解

删除倒数第二个节点:

1.fast向前走两步:

2.当fast走到NULL的位置时,slow刚好指向要删除的节点:

 

4.代码

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    if(head==NULL){
        return NULL;
    }
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    struct ListNode* record=head;//记录slow上一次的位置,用来删除slow指向的节点
    while(n&&fast){
        fast=fast->next;
        n--;
    }
    if(fast==NULL){//说明此时要删除的节点是头节点,需要改变head的指向
       head=head->next;
    }
    while(fast){
        record=slow;
        fast=fast->next;
        slow=slow->next;
    }
    record->next=slow->next;
    free(slow);
    return head;
}

以上代码需要注意一点,当走完第一个循环后fast为空,此时说明要删除的节点是链表的第一个节点,那么就需要改变头指针head的指向。

### LeetCode 数据结构题单与练习列表 以下是关于数据结构相关的经典题目分类以及推荐的练习列表: #### 数组 数组是最基础的数据结构之一,在许多算法设计中扮演重要角色。以下是一些经典的数组处理问题: 1. **移除元素** 这是一个典型的双指针问题,目标是在 O(1) 的额外空间复杂度下实现原地修改数组的功能[^1]。 ```c int removeElement(int* nums, int numsSize, int val) { int a = 0; int b = 0; while (a < numsSize) { if (nums[a] != val) { nums[b] = nums[a]; b++; } a++; } return b; } ``` 2. **两数之和** 找到两个数使得它们相加等于给定的目标值。 #### 链表 链表的操作涉及节点的增删改查,常见问题如下: 1. **反转链表** 实现一个函数来反转单向链表。 2. **删除倒数第 N 个结点** 删除链表中的倒数第 n 个节点并返回其头节点。 #### 堆栈与队列 堆栈和队列是两种重要的线性数据结构,常用于解决括号匹配、浏览器历史记录等问题。 1. **有效的括号** 判断字符串中的括号是否有效配对。 2. **滑动窗口最大值** 计算大小为 k 的滑动窗口的最大值。 #### 字符串 字符串问题是面试中最常见的类型之一,通常涉及到子串查找、模式匹配等内容。 1. **最长无重复字符的子串** 寻找字符串中最长的不含有重复字符的子串长度。 2. **最小覆盖子串** 查找能完全覆盖另一个字符串所有字符的最小子串。 #### 树 树形结构广泛应用于文件系统表示、表达式求解等领域。 1. **二叉树遍历** 包括前序、中序、后序三种基本遍历方式。 2. **验证二叉搜索树** 检测一棵二叉树是否满足二叉搜索树性质。 #### 图 图的应用场景非常广,比如社交网络分析、地图路径规划等。 1. **克隆图** 返回由深拷贝得到的新图实例。 2. **岛屿数量** 统计二维网格中连通区域的数量。 以上仅列举部分典型例子,实际刷题过程中可以根据个人薄弱环节有针对性地加强训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值