链表中倒数第k个结点

来源:互联网 发布:绿蔓的读音知乎 编辑:程序博客网 时间:2024/06/05 11:57

题目描述

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

解题思路

定义两个指针p1和p2,相隔k个结点的位置,p2在前。同时向前移动p1和p2,直到p2为NULL(尾后指针),此时p1指向链表倒数第k个结点。


需要注意的是,链表的长度可能不到k,这样就根本不存到倒数第k个结点,需要返回NULL。判断的方法是,在初始化p1和p2时,如果还没将p2移到相应的位置,就已经超过了链表尾部,则表明链表长度不够。


代码

/*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 (k == 0 || !pListHead)            return NULL;                ListNode* p1 = pListHead;        ListNode* p2 = pListHead; //前后两个指针,相隔k个位置                int i = 0;        while (i < k && p2 != NULL) //将p2移动k个位置        {            p2 = p2->next;            i++;        }                if (i < k) //k大于链表长度            return NULL;                while (p2 != NULL) //同时移动p1和p2,直到p2为NULL,此时p1就是要输出的结点        {            p1 = p1->next;            p2 = p2->next;        }                return p1;    }};



原创粉丝点击