题解 |华为HJ51 #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
struct ListNode { int m_nKey; ListNode* m_pNext; };
正常返回倒数第k个结点指针,异常返回空指针.
要求:
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围:链表长度满足 1≤n≤1000 ,k≤n ,链表中数据满足 0≤val≤10000
本题有多组样例输入。
输入描述:
输入说明
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 文章被收录于专栏
机试的题解