面试题22:链表中倒数第k个结点

题目描述
输入一个链表,输出该链表中倒数第k个结点。
方法一:空间换时间,注意k为无符号整数,k-1得到的将不是-1,而是4292967295(无符号的0xFFFFFFFF)。

/*
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 || k == 0)
            return nullptr;
        vector<ListNode*> vec;
        ListNode* p = pListHead;
        while(p != nullptr)
        {
            vec.push_back(p);
            p=p->next;
        }
        if(vec.size()<k)
            return nullptr;
        return vec[vec.size()-k];
    }
};

方法二:一次遍历完成,注意输入检查。

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(!pListHead || k == 0)
            return nullptr;
        ListNode* ahead = pListHead;
        ListNode* behind = nullptr;
        for(unsigned int i = 0; i < k - 1; ++ i)
        {
            if(ahead->next != nullptr)
                ahead = ahead->next;
            else
                return nullptr;
        }
        behind = pListHead;
        while(ahead->next != nullptr)
        {
            ahead = ahead->next;
            behind = behind->next;
        }
        return behind;
    }
};

猜你喜欢

转载自blog.csdn.net/chineseqsc/article/details/81269157