描述
输入一个单向链表,输出该链表中倒数第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运行截图:
总结:
①都是单链表经典的步骤,多练练增加熟练度,算法倒是不难;
②当前帖子仅供自我精进、学习使用,有不足之处欢迎指正。

京公网安备 11010502036488号