题目描述
输入一个单向链表,输出该链表中倒数第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值需要重头遍历
题目实例中还有多次输入输出情况因此需要循环输入
具体实现
#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)
小结
408好像考过类似数据结构题,难度简单,主要是掌握双指针的思想