题目描述
输入一个单向链表,输出该链表中倒数第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的值
输出描述:
输出一个整数
输入: 8
1 2 3 4 5 6 7 8
4
输出:
5
思路
先根据输入构建链表,然后再根据k的值让指针向后走k步,再定义一个头指针结点,因为头指针和当前指针相差为k,所以当 当前指针指向末尾时,新定义的指针和末尾相差k,即为所求。
具体实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
typedef struct ListNode {
int m_nKey;
ListNode* m_pNext;
} Listnode, * Lnode;
int main() {
Lnode list;
int i, m, k;
while (scanf("%d", &i) != EOF) {
list = (Lnode)malloc(sizeof(Listnode));
list->m_pNext = NULL;
Lnode p = list, q = p;
for (int j = 0; j < i; j++) {
scanf("%d", &m);
Lnode s = (Lnode)malloc(sizeof(Listnode));
s->m_nKey = m;
s->m_pNext = p->m_pNext;
p->m_pNext = s;
p = s;
}
scanf("%d", &k);
for (int n = 0; n < k; n++) {
if (q != NULL) {
q = q->m_pNext;
}
else
return NULL;
}
Lnode r = list;
while (q != NULL) {
r = r->m_pNext;
q = q->m_pNext;
}
printf("%d\n", r->m_nKey);
}
return 0;
}
时间复杂度
O(n)
小结
对链表和结构体的掌握还不太熟悉,请教了群里的不二大佬,参考了一下解题思路。