牛客网---链表中倒数第K个结点

来源:牛客网
题目描述
输入一个链表,输出该链表中倒数第k个结点。

思路1:(效率慢)
可以先遍历求出链表中有多少个结点,第二次再从前往后走,让count–,直到count=k,则找到了该结点。

class Solution {
public:
	ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
		unsigned count = 0;//计算一共有多少个结点
		ListNode* cur = pListHead;
		while (cur)
		{
			count++;
			cur = cur->next;
		}
		ListNode* p = pListHead;
		while (count != k&&p)
		{
			p = p->next;
			count--;
		}
		return p;
	}
};

思路2:快慢指针
定义两个指针放到头结点的位置,让一个指针先走k步停下来。这时,两指针差k步(慢指针在头结点的位置,快指针在距离慢指针k步的位置),让它们同时向后一步步走,当快指针走到结尾,慢指针就在倒数第K个结点的位置了。

class Solution {
public:
	ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
		ListNode* fast = pListHead;
		ListNode* slow = pListHead;
		while (k--)//链表为空以及K==0在这个循环里就一起检测了
		{
			if (fast) fast = fast->next;
			else return NULL;
		}
		while (fast)
		{
			slow = slow->next;
			fast = fast->next;
		}
		return slow;
	}
};
发布了78 篇原创文章 · 获赞 2 · 访问量 3322

猜你喜欢

转载自blog.csdn.net/weixin_43219708/article/details/104747965
今日推荐