BM9 删除链表的倒数第n个节点
知识点链表双指针
描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,给出的链表为: ,
.
删除了链表的倒数第 个节点之后,链表变为
.
数据范围: 链表长度 ,链表中任意节点的值满足
要求:空间复杂度
,时间复杂度
备注:题目保证 一定是有效的
示例1
输入:
{1,2},2
复制返回值:
{2}
题解
思路:
和BM8一样,只是在找第k个节点的时候,将其前驱节点保存一下就可以了。具体见代码:
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;
}