首页 > 其他 > 详细

寻找链表的倒数第k个节点

时间:2020-09-04 09:47:08      阅读:45      评论:0      收藏:0      [点我收藏+]

寻找链表的倒数第k个节点

题目:已知一个带有表头结点的单链表,节点结构为(data,next),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的节点(k为正整数),若查找成功,返回指向该节点的指针;否则,返回nullptr。

解法:设置两个指针p1,p2同时指向单链表的表头,令p2向后移动k个节点。下图为k=3的情况

技术分享图片

之后同步向后移动p1和p2,当p2为nullptr的时候,p1即为所求。

技术分享图片

代码:

struct Node
{
	int data;
	Node* next;
};

using List = Node*;

Node* locateNodeFromBottom(List l, int k)
{
	Node* p1 = l;
	Node* p2 = l;
	//p2向后移动k步
	for (int step = 0; step < k && p2 != nullptr; ++step)
		p2 = p2->next;

	//若链表长度小于k,则返回nullptr
	if (nullptr == p2)
		return nullptr;

	//同步移动p1和p2,当p2为nullptr时,p1即为所求
	while (p2 != nullptr)
	{
		p2 = p2->next;
		p1 = p1->next;
	}

	return p1;
}

时间复杂度:该算法只遍历了一次链表,故算法的时间复杂度为O(n)

寻找链表的倒数第k个节点

原文:https://www.cnblogs.com/howelldong/p/13611560.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!