题目描述
输入一个链表,输出该链表中倒数第k个结点。
由于这是单链表,只能往一个方向遍历,因此第一想法可能是先遍历一遍链表,计算一下链表节点的总个数n
,再从头开始走n - k
个节点就是倒数k个节点。这种思路并没有啥毛病,不过有一种只访问一遍的思路。
使用resPtr
、kAfterPtr
两个指针,kAfterPtr
比resPtr
先除法k个节点。
然后resPtr
、kAfterPtr
同时向后移动,当kAfterPtr
到达链表的尾端时,此时resPtr
指向的就是倒数第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) {
ListNode *resPtr = pListHead, *kAfterPtr = pListHead;
//kAfterPtr先出发k个节点
while (k > 0) {
if (kAfterPtr == NULL) {
//可能出现链表长度为5,但是要求找倒数第6个
return NULL;
}
k -= 1;
kAfterPtr = kAfterPtr->next;
}
//resPtr、kAfterPtr再同时移动
while (kAfterPtr != NULL) {
resPtr = resPtr->next;
kAfterPtr = kAfterPtr->next;
}
return resPtr;
}
};