【算法百题之五十一】删除链表的第n个结点

本文介绍了一种在O(log n)时间复杂度下删除链表中倒数第n个节点的方法,并给出了具体的实现代码。

【算法百题之五十一】删除链表的第n个结点

 

   大家好,我是Lampard~~

   很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!

   今天的问题是:删除链表的第n个结点

   

   示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

思路:要求时间复杂度为log(n),那我们就用空间换时间,使用向量把读到的结点存起来 

结点结构:

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

算法代码:

要注意两个特殊情况,一个是要删除的长度大于链表长度则不用操作,若刚好相等则返回第二个节点即可。

ListNode* removeNthFromEnd(ListNode* head, int n) {
	vector<ListNode*> list2Vec;
	ListNode *curNode = head;
	while (curNode != nullptr) {
		list2Vec.push_back(curNode);
		curNode = curNode->next;
	}

	int length = list2Vec.size();
	if (n > length) return head;
	if (n == length) return head->next;
	list2Vec[length - 1 - n]->next = list2Vec[length - n]->next;
	return head;
}

测试结果:

 

OK,今天的博客就到这里,谢谢大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值