【剑指Offer】【链表】链表中倒数第k个结点

题目:输入一个链表,输出该链表中倒数第k个结点。

 

A1:先从头到尾扫描链表,得到链表的总长度n,然后再扫描一次链表,输出n-k+1处的结点  ===> 测试用例超时

A2:创建两个指针,一个遍历链表到k处,若链表已指向空,则返回false

   到k处后,进入第二个循环,指针A与指针B一起向后移动,当指针A指向nullptr时返回,结果为指针B指向的结点

   因为指针A和指针B一直保持k距离

 

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if ((pListHead == nullptr) || (k < 1))
		{
			return nullptr;
		}
		ListNode* pNodeA = pListHead;
		ListNode* pNodeB = pListHead;

		while (k > 0)
		{
			if (pNodeA == nullptr)
			{
				return nullptr;
			}
			pNodeA = pNodeA->next;
			k--;
		}
		while (pNodeA != nullptr)
		{
			pNodeA = pNodeA->next;
			pNodeB = pNodeB->next;
		}
		return pNodeB;
    }
};

  

 

//这个解法,是两个指针距离保持在k-1的,在VS下成功通过,但是在牛客编辑器中说有段错误,很奇怪

//和上一个解法差不多相同

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {

		if ((pListHead == nullptr) || (k < 1))
		{
			return nullptr;
		}
		ListNode* pNodeA = pListHead;
		ListNode* pNodeB = pListHead;
		ListNode* pNodeA = pListHead;
		ListNode* pNodeB = pListHead;

		while (k > 1)
		{
			if (pNodeA == nullptr)
			{
				return nullptr;
			}
			pNodeA = pNodeA->next;
			k--;
		}
		while (pNodeA->next != nullptr)
		{
			pNodeA = pNodeA->next;
			pNodeB = pNodeB->next;
		}
		return pNodeB;
        }    

  

 

posted @ 2019-08-28 21:33  XieXinBei0318  阅读(127)  评论(0编辑  收藏  举报