题目链接地址:
九度OJ-题目1517:链表中倒数第k个结点
题目描述:
输入一个链表,输出该链表中倒数第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 ****************************************************************/