题目链接地址:
题目描述:
输入一个链表,输出该链表中倒数第k个结点。
(hint: 请务必使用链表。)
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素。
输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素。
输出:
对应每个测试案例,
若有结果,输出相应的查找结果。否则,输出NULL。
样例输入:
5 2
1 2 3 4 5
1 0
5
样例输出:
4
NULL
解题思路:
这道题我是参考网上的解法做的,大概思路是:先用一个指针p1指向链表中的第k个结点,然后让指针p2从头结点出发去"追赶"p1指针,每"追赶"一次,p1和p2指针都向右移动一个位置,当p1指针指向链表中最后一个元素的下一个位置时,p2指向的就是当前链表中的倒数第k个结点。需要注意的是链表中倒数第0个结点并不是链表的最后一个结点,而是链表中最后一个结点所指向的下一个结点,也就是NULL。
AC代码如下:
#include<stdio.h>
#include<malloc.h>
// 构造链表结点
typedef struct LNode
{
int data; // 数据域
LNode * next; // 指针域
}LinkList;
/**
* 创建一个单链表
* @param n 表示单链表中结点数目
* @return head 单链表的头指针
*/
LinkList * createLinkList(int n)
{
LinkList * head = (LinkList *)malloc(sizeof(LinkList)); // 构造链表的头结点
head -> next = NULL;
LinkList * p = head; // p始终指向链表中的最后一个结点
int i;
int data;
for(i = 1;i <= n;i++)
{
LinkList * s = (LinkList *)malloc(sizeof(LinkList));
scanf("%d",&data);
s -> data = data;
s -> next = p -> next;
p -> next = s; // 将s结点插入到p结点的后面
p = s;
}
return head;
}
/**
* 输出链表中倒数第k个结点
* 先用一个指针p1指向链表中的第k个结点;
* 然后让指针p2从头结点出发去"追赶"p1指针;
* 每"追赶"一次,p1和p2指针都向右移动一个位置
* 当p1指针指向链表中最后一个元素的下一个位置时,p2指向的就是当前链表中的倒数第k个结点
* @param head 链表的头指针
* @param k 该链表中倒数第k个结点
* @return void
*/
void printBackwordsNInLinklist(LinkList * head,int k)
{
int i = 1; // 注意i的初始值是1,不是0
LinkList * p1 = head;
// 先将p1指针指向链表中的第k个结点
while((p1 != NULL) &&(i <= k))
{
p1 = p1 -> next;
i++;
}
if(NULL == p1) // 当 k > n(n为链表中的结点个数)时的情况
{
printf("NULL\n");
}
else
{
LinkList * p2 = head; // p2指针从链表头结点开始去追赶p1指针
while(p1 != NULL)
{
p1 = p1 -> next;
p2 = p2 -> next;
}
if(NULL == p2) // 当k == 0时的情况
{
printf("NULL\n");
}
else // 当p1指向链表的最后一个结点的next(p1 == NULL)时,p2刚好指向链表的倒数第k个结点
{
printf("%d\n",p2 -> data);
}
}
}
int main()
{
int n,k;
LinkList * head;
while(EOF != scanf("%d%d",&n,&k))
{
head = createLinkList(n);
printBackwordsNInLinklist(head,k);
}
return 0;
}
/**************************************************************
Problem: 1517
User: blueshell
Language: C++
Result: Accepted
Time:100 ms
Memory:2604 kb
****************************************************************/