剑指offer--面试题15

题目:打印单向链表中倒数第k个节点

以下为自己所写代码,未经过验证,只是写个思路。。。

#include<iostream>
#include<vector>
#include<exception>

using namespace std;
//节点定义
struct ListNode
{
    int m_nValue;
    ListNode* m_pNext;
};

void FindKthToTail(ListNode* pHead, unsigned int k)
{
    if(pHead == NULL)
        throw new std::exception("Invalid parameters!");

    std::vector<int> Values;
    ListNode* pNode = pHead;

    while(pNode != NULL)
    {
        Values.push_back(pNode->m_nValue);
        pNode = pNode->m_pNext;
    }

    if(k > Values.size())
        throw new std::exception("Invalid parameters!");
    else
        std::cout<<Values[Values.size() - k]<<std::endl;    

}

如果不允许使用vector,则另想办法:用具有某种限制的两个指针进行一次遍历即可!

自己所写代码如下:

ListNode* FindKthToTail(ListNode* pHead, unsigned int k)
{
    if(pHead == NULL || k <= 0)
        return NULL;
    int index = 1;
    ListNode* pNode = pHead;
    while(i <= k && pNode != NULL)
        pNode = pNode->m_pNext;
    if(pNode == NULL)
        return NULL;
    else
    {
        ListNode* pNodeFollow = pHead;
        while(pNode->m_pNext != NULL)
        {
            pNode = pNode->m_pNext;
            pNodeFollow = pNodeFollow->m_pNext;
        }
    }

    return pNodeFollow;

}

错误处理后,均return NULL;

让防御性编程成为自己的习惯!

posted on 2013-08-12 10:15  -赶鸭子上架-  阅读(192)  评论(0编辑  收藏  举报