题解 |华为HJ51 #输出单向链表中倒数第k个结点#

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

https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d

描述

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

链表结点定义如下:
struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针.
要求:
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围:链表长度满足 1n1000  ,kn  ,链表中数据满足 0val10000 
本题有多组样例输入。

输入描述:

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

输出描述:

输出一个整数

示例1

输入:
8
1 2 3 4 5 6 7 8
4
输出:
5
代码:
#include<stdio.h>
#include<stdlib.h>
//以下是Senky的代码
typedef struct {
    int m_nKey;//0≤val≤10000
    struct ListNode* m_pNext;
} Node; //题目规定的单链表格式

int main() {
    int n = 0;//单链表节点个数1≤n≤1000
    int i = 0;//循环变量

    while (~scanf("%d", &n)) { //多组输入
        //每循环一次就重新建立头尾指针
        Node* head = (Node*)malloc(sizeof(Node));//单链表头指针
        head->m_nKey = 0;//头结点初始化
        head->m_pNext = NULL;
        Node* rear = (Node*)malloc(sizeof(Node));//单链表尾指针
        rear = head;

        for (i = 0; i < n; i++) { //链接单链表
            Node* s = (Node*)malloc(sizeof(Node));//单链表新结点
            scanf("%d", &(s->m_nKey));//新结点元素域
            s->m_pNext = rear->m_pNext;//新节点指针域
            rear->m_pNext = s;//链接入单链表
            rear = s;//尾指针指向新的尾
        }
        //输出部分
        {
            int k = 0;//需要输出倒数第k个元素
            scanf("%d", &k);//手动输入k的值
            if (k <= n) { //k≤n
                //因为有多组输入,所以头不能动,只能找一个临时指针
                Node* find = head->m_pNext;
                for (int i = 1; i <= n - k; i++) {
                    find = find->m_pNext;//这样写代码,find移动了n-k+1次
                }
                printf("%d\n", find->m_nKey);
                free(find);
            } else {
                return NULL;//异常返回空指针
            }
        }
        free(head);
    }
    return 0;//编辑于2022/09/16
}
VS2022运行截图:

图解:

总结:
①都是单链表经典的步骤,多练练增加熟练度,算法倒是不难;
②当前帖子仅供自我精进、学习使用,有不足之处欢迎指正。
#华为笔试#
华为-HJ 文章被收录于专栏

机试的题解

全部评论

相关推荐

04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务