算法打卡day6 2023.01.13
题目描述
输入一个单向链表,输出该链表中倒数第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次,再两个一起遍历,第一个到尾时,第二个刚好到倒数第二个
具体实现
#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)
小结
利用链表数据结构,和双指针实现