您的位置:首页 > Web前端

剑指Offer——(14)链表中倒数第k个结点

2017-05-07 18:03 239 查看
题目描述:

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

实现如下:

//在线测试用例依旧是无头链表→_→
//最后一个节点定义为倒数第一个节点
//1->2->3->4->5
//p     s
//      p     s
//eg.寻找倒数第3个节点 k-1=2
//要想一次遍历找到倒数第k个节点,关键在于最后一个节点与倒数第k个节点之间相差k-1个节点
//所以要保证两个指针之间一直保持k-1个节点差
//健壮性:
//1.传入空指针
//2.k为无符号正数,k<1
//3.不存在倒数第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 < 1) return NULL;//传入空指针、k无效

ListNode *p = pListHead;
ListNode *s = pListHead;
int num = 0;//记录s指针移动的次数
while (s->next != NULL)//直到遍历完此链表
{
s = s->next;
++num;
//当s移动次数大于等于k时,才能让p开始移动,此时两指针保持k-1距离
if (num >= k) p = p->next;
}
//如果s移动次数都小于两者必须的间距,说明不存在倒数第k个节点
if (num < k - 1) return NULL;
return p;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息