华为机试HJ51:输出单向链表中倒数第k个结点

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ51:输出单向链表中倒数第k个结点相关的知识,希望对你有一定的参考价值。

题目描述:

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。

链表结点定义如下:

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};

正常返回倒数第k个结点指针,异常返回空指针

本题有多组样例输入。

输入描述:

输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值

输出描述:

输出一个整数

示例:

输入:

8
1 2 3 4 5 6 7 8
4

输出:

5

解题思路:

这道题偷懒可以用vector数组做,非常简单。

采用题目要求的链表来做:定义ListNode的构造函数,输入链表长度;设置好表头,每次输入数值就new一个节点并连接;输入target,即倒数第target个节点,遍历链表number-target次,即可让指针指向目标节点,输出该节点的值即可。

测试代码:

#include <iostream>
#include <vector>

using namespace std;

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
    // 构造函数
    ListNode(int x):m_nKey(x),m_pNext(nullptr){};
};

int main()
{
    int number;
    while(cin>>number)
    {
        ListNode* head=new ListNode(-1);
        ListNode* p=head;
        for(int i=0;i<number;++i)
        {
            int t;
            cin>>t;
            ListNode* tp=new ListNode(t);
            tp->m_pNext=nullptr;
            p->m_pNext=tp;
            p=tp;
        }
        int target;
        cin>>target;
        if(target<=0||target>number)
        {
            cout<<0<<endl;
            continue;
        }
        for(int i=0;i<number-target+1;++i)
        {
            head=head->m_pNext;
        }
        cout<<head->m_nKey<<endl;
    }
    return 0;
}

以上是关于华为机试HJ51:输出单向链表中倒数第k个结点的主要内容,如果未能解决你的问题,请参考以下文章

华为机试题 HJ51输出单向链表中倒数第k个结点

华为机试HJ48:从单向链表中删除指定值的节点

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

链表中倒数第K个结点

链表中倒数第k个结点

链表的倒数第k个节点