1. 题目描述
输入一个链表,输出该链表中倒数第k个结点。
2. 分析
链表不像数组一样有下标。所以需要用指针操作。可以对指针进行操作。
方法一:先利用指针进行计数,然后从头挪动指针len-k次,即可。len是链表中元素的个数。
方法二是先将指针挪动到最末,然后超前移动k次。但因为单向链表只有后项链接指针,所以该方法不适用。
3. 题目解答
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
// exception
if(k<=0 || pListHead == nullptr)
return nullptr;
ListNode* temp = pListHead;
// count the length of the list
unsigned int cnt = 0;
while(pListHead){
++cnt;
pListHead = pListHead->next;
}
if (k > cnt) {
return nullptr;
}
// which one
cnt -= k;
for (unsigned int i = 0;i < cnt;i++) {
temp = temp->next;
}
return temp;
}
};