0
点赞
收藏
分享

微信扫一扫

[链表]BM9 删除链表的倒数第n个节点-简单

ixiaoyang8 2022-06-12 阅读 56

​​BM9 删除链表的倒数第n个节点​​

知识点​​链表​​​​双指针​​

描述

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

例如,给出的链表为: [链表]BM9 删除链表的倒数第n个节点-简单_链表[链表]BM9 删除链表的倒数第n个节点-简单_链表_02.

删除了链表的倒数第 [链表]BM9 删除链表的倒数第n个节点-简单_双指针_03 个节点之后,链表变为[链表]BM9 删除链表的倒数第n个节点-简单_双指针_04.

数据范围: 链表长度 [链表]BM9 删除链表的倒数第n个节点-简单_双指针_05,链表中任意节点的值满足 [链表]BM9 删除链表的倒数第n个节点-简单_双指针_06要求:空间复杂度 [链表]BM9 删除链表的倒数第n个节点-简单_双指针_07,时间复杂度 [链表]BM9 删除链表的倒数第n个节点-简单_双指针_08

备注:题目保证 [链表]BM9 删除链表的倒数第n个节点-简单_双指针_03 一定是有效的

示例1

输入:

{1,2},2

复制返回值:

{2}


题解

思路:

和BM8一样,只是在找第k个节点的时候,将其前驱节点保存一下就可以了。具体见代码:

#include <bits/stdc++.h>

struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(nullptr)
{
}
ListNode() = default;
};

ListNode *removeNthFromEnd(ListNode *head, int k)
{
int i = 0;
auto node = head;
while (i < k && node != nullptr)
{
node = node->next;
i++;
}

if (i < k)
{
return nullptr;
}

auto kth_node = head;
ListNode *pre_node = nullptr;
while (node != nullptr)
{
pre_node = kth_node;
kth_node = kth_node->next;
node = node->next;
}

if (pre_node == nullptr)
{
head = head->next;
}
else
{
pre_node->next = kth_node->next;
}
return head;
}
举报

相关推荐

0 条评论