HJ51 输出单向链表中倒数第k个结点

这篇具有很好参考价值的文章主要介绍了HJ51 输出单向链表中倒数第k个结点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面:

做题环境如下:
题目渠道:牛客网 HJ51 输出单向链表中倒数第k个结点 华为机试题
编程语言:C++

一、题目描述

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

链表结点定义如下:

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

正常返回倒数第k个结点指针,异常返回空指针.
要求:
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围:链表长度满足 [1,1000],链表中数据满足 [0,10000]
输入描述:
输入说明

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

输出描述:

输出一个整数

示例1
输入:

8
1 2 3 4 5 6 7 8
4

输出

5

说明:本题有多组样例输入。

二、题目分析&解题思路

2.1 处理好输入

牛客网与leetCode 不同,牛客 需要自己处理好输入,构建输入环境,而这里题目给出了单链表节点类型的写法,那么如果再使用 容器 list 那么就有点没意思了,因此需要自己逐个添加节点,设置节点值、下一个节点指针等,这里需要注意 本题有多组样例输入 那么说明我们需要把我们的代码写在一个 while 循环里,供测试用例循环输入:

    int number;
    while (cin >> number) {//循环测试用例输入
        ListNode* head = new ListNode();//头节点
        ListNode* next = new ListNode();
        bool bflag = true;
        while (number > 0) {
            int val;
            cin >> val;
            ListNode* nodeTemp = new ListNode();//构建每一个节点
            nodeTemp->m_nKey = val;
            nodeTemp->m_pNext = nullptr;
            if (bflag) {
                head = nodeTemp;//先将头节点保存
                next = head;
                bflag = false;
            } else {
                next->m_pNext = nodeTemp;//逐个链接起来
                next = next->m_pNext;
            }
            --number;
        }
        int key;
        cin >> key;
        getReversKeyNode(head, key);
    }

2.2 处理输出

也就是实现将倒数第 K 个节点值输出,这里直接遍历所有的节点,保存到一个 vector 中,直接根据K 计算出节点下标,输出即可,代码复杂度为 O(n)

void getReversKeyNode(ListNode* head, int key) {

    vector<ListNode*> vctTemp;
    while (head != nullptr) {
        vctTemp.push_back(head);
        head = head->m_pNext;
    }
    if (vctTemp.size() > 0) {
        if (key <= vctTemp.size() && key >= 0 ) {
            cout << vctTemp[vctTemp.size() - key]->m_nKey << endl;//计算下标
        } else {
            cout << "error" << endl;
        }
    }
}

三、代码实现

#include <iostream>
#include <vector>
using namespace std;
typedef struct ListNode {
    int m_nKey;
    ListNode* m_pNext;
} ListNode;
void getReversKeyNode(ListNode* head, int key) {

    vector<ListNode*> vctTemp;
    while (head != nullptr) {
        vctTemp.push_back(head);
        head = head->m_pNext;
    }
    if (vctTemp.size() > 0) {
        if (key <= vctTemp.size() && key >= 0 ) {
            cout << vctTemp[vctTemp.size() - key]->m_nKey << endl;//计算下标
        } else {
            cout << "error" << endl;
        }
    }
    else
    {
    	cout<<"error<<endl;
    }
}
int main() {
    int number;
    while (cin >> number) {//循环用例输入
        ListNode* head = new ListNode();//头节点
        ListNode* next = new ListNode();
        bool bflag = true;
        while (number > 0) {
            int val;
            cin >> val;
            ListNode* nodeTemp = new ListNode();//构建每一个节点
            nodeTemp->m_nKey = val;
            nodeTemp->m_pNext = nullptr;
            if (bflag) {
                head = nodeTemp;//设置头节点
                next = head;
                bflag = false;
            } else {
                next->m_pNext = nodeTemp;//链接每一个节点
                next = next->m_pNext;
            }
            --number;
        }
        int key;
        cin >> key;
        getReversKeyNode(head, key);
    }

}

运行结果:
HJ51 输出单向链表中倒数第k个结点文章来源地址https://www.toymoban.com/news/detail-432160.html

到了这里,关于HJ51 输出单向链表中倒数第k个结点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用一个尽可能高效的算法,查找单向链表(有头结点)中倒数第k个位置上的结点

       定义两个指向链表首结点的指针变量,第一个指针变量向后移动k个位置后,第二个指针变量也开始跟着一起向后移动,直到第一个指针变量指向尾结点为止,第二个指针变量指向的位置结点就是倒数第k个结点。

    2024年04月24日
    浏览(37)
  • 【链表OJ】链表中倒数第k个结点 合并两个链表(含哨兵位) 分割链表 链表的回文结构

    前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣和牛客上链表OJ题目 目录  一、链表中倒数第k个结点 题目描述: 解题思路: 二.合并两个链表(含哨兵位)  题目描述: 解题思路:                                     

    2024年02月12日
    浏览(50)
  • 【代码随想录 | Leetcode | 第六天】链表 | 反转链表 | 两两交换链表中的节点 | 删除链表的倒数第 N 个结点

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来反转链表、两两交换链表中的节点和删除链表的倒数第N个节点的分享 ✨ ✨题目链接点这里 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 示例 2: 示例 3: 提示: 链表中节点的数

    2024年02月16日
    浏览(58)
  • 算法刷题Day4 两两交换链表中的节点+删除链表的倒数第N个结点+链表相交+环形链表

    使用dummy节点可以极大地简化过程 有个地方折磨了我有一会儿,是粗心导致的,而且提示的错误也很难发现是哪里导致的。就是在case为 head = [1], n = 1 时,最后释放了 tmp 之后(此时 tmp 刚好指向 head ,我还 return head; ,意思就是操作了已经被我释放的内存, leetcode 就报错了

    2024年02月09日
    浏览(49)
  • Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点

    吾心信其可行,则移山填海之难,终有成功之日。                           --孙中山 目录 🍉一.删除链表的倒数N个结点 🌻1.双指针 🍁2.求链表的长度 🌸二.删除链表的中间的结点 给你一个链表,删除链表的倒数第  n   个结点,并且返回链表的头结点。 示例 1: 示例

    2024年02月01日
    浏览(69)
  • LeetCode | 19. 删除链表的倒数第 N 个结点

    OJ链接 思路: 定义虚拟头节点 dummy 并初始化使其指向 head 然后定义快慢指针 让快指针先走n步 然后一起走 最后删除倒数第n个节点 然后释放虚拟节点 dummy

    2024年02月04日
    浏览(74)
  • LeetCode:19. 删除链表的倒数第 N 个结点

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 来源:力扣(LeetCode) 难度: 中等 提示: 链表中结点的数目为 sz 1 = sz = 30 0 = Node.val = 100 1 = n = sz 示例

    2024年02月02日
    浏览(74)
  • LeetCode19:删除链表的倒数第N个结点

    力扣题目链接

    2024年01月21日
    浏览(50)
  • 【LeetCode】19. 删除链表的倒数第 N 个结点

    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1], n = 1 输出:[] 示例 3: 输入:head = [1,2], n = 1 输出:[1] 这题直接不会 循环迭代 为什么用 head 代替 dummy 不行? 因为可能存在只有一

    2024年02月07日
    浏览(42)
  • 【算法Hot100系列】删除链表的倒数第 N 个结点

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包