题目描述
输入一个链表,输出该链表中倒数第k个结点。
解:最容易实现的方法就是遍历链表的长度,然后求出倒数第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 == NULL)
return NULL;
int len = 0;
ListNode *p = pListHead;
while(p != NULL)
{
len++;
p = p -> next;
}
p = pListHead;
int ind = len - k;
if(ind < 0)
return NULL;
while(ind > 0)
{
ind--;
p = p -> next;
}
return p;
}
};
此外,为了提高效率,可以采用双指针进行搜寻,让两个指针之间间隔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 == NULL || k <= 0)
return NULL;
ListNode *p = NULL,*q = NULL;
p = pListHead;
q = p -> next;
while(q != NULL && k > 1)
{
k--;
q = q -> next;
}
if (q == NULL && k > 1)
return NULL;
while(q != NULL)
{
p = p -> next;
q = q -> next;
}
return p;
}
};