链表中倒数第k个结点

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

思路一:先遍历整个链表,统计链表的个数,然后总个数-k就是所求的结果

但是太无脑了

所以思路二:

用两个指针, first 和 second

first先走k-1次,然后second再走,当first 到最后一个,second就是所求的了

 

 代码:

// 两个指针,一个在前(先走k-1次),第二个在走
//当第一个到头了,第二个就是倒数k个
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    if(pListHead == nullptr ||k <= 0)
        return nullptr;
    ListNode *first = pListHead;
    ListNode *second = pListHead;
    for(int i = 0; i < k-1; i++)
    {
        if (first->next != nullptr)
            first = first->next;
        else
            return nullptr;
    }
    while(first->next != nullptr)
    {
        first = first->next;
        second = second->next;
    }
    return second;
    
    }
};
/*
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 == nullptr ||k <= 0)
        return nullptr; 
    int num = 1;
    ListNode *p1 = pListHead;
    ListNode *p2 = pListHead;
    while(p1->next != nullptr)
    {
        num++;
        p1 = p1->next;
    }
    int t = num-k;
    if (t < 0)
        return nullptr;
    while(t--)
    {
        p2 = p2->next;
    }
    return p2;
}
};
无脑写法

 

posted @ 2020-03-14 17:08  Lucky&  阅读(131)  评论(0编辑  收藏  举报
//返回顶部开始
//返回顶部结束