面试题15 链表中倒数第K个结点

来源:互联网 发布:fireworks mac版 编辑:程序博客网 时间:2024/06/05 20:54
题目描述:

输入一个链表,输出该链表中倒数第k个结点。
(hint: 请务必使用链表。)

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素。
输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素。

输出:

对应每个测试案例,
若有结果,输出相应的查找结果。否则,输出NULL。

样例输入:
5 21 2 3 4 51 05
样例输出:
4NULL
【解析】





【代码】

[cpp] view plaincopy
  1. /********************************* 
  2. *   日期:2013-11-20 
  3. *   作者:SJF0115 
  4. *   题号: 题目1517:链表中倒数第k个结点 
  5. *   来源:http://ac.jobdu.com/problem.php?pid=1517 
  6. *   结果:AC 
  7. *   来源:剑指Offer 
  8. *   总结: 
  9. **********************************/  
  10. #include<iostream>  
  11. #include <stdio.h>  
  12. #include <malloc.h>  
  13. #include <string.h>  
  14. using namespace std;  
  15.   
  16. typedef struct ListNode{  
  17.     int value;  
  18.     struct ListNode *next;  
  19. }ListNode;  
  20.   
  21. int FindKthToTail(ListNode*head,int k){  
  22.     //容错处理  
  23.     if(head == NULL || k <= 0){  
  24.         return NULL;  
  25.     }  
  26.     else{  
  27.         ListNode *p,*pre;  
  28.         //带头节点的链表  
  29.         pre = p = head->next;  
  30.         //第一个指针向前走k-1步,第二个指针保持不变  
  31.         for(int i = 0;i < k-1;i++){  
  32.             p = p->next;  
  33.         }  
  34.         //两个指针同时向前遍历  
  35.         while(p->next != NULL){  
  36.             pre = pre->next;  
  37.             p = p->next;  
  38.         }  
  39.         return pre->value;  
  40.     }  
  41. }  
  42.   
  43. int main()  
  44. {  
  45.     int i,n,k;  
  46.     while(scanf("%d %d",&n,&k) != EOF){  
  47.         ListNode *head,*p,*pre;  
  48.         head = (ListNode*)malloc(sizeof(ListNode));  
  49.         head->next = NULL;  
  50.         pre = head;  
  51.         for(i = 0;i < n;i++){  
  52.             p = (ListNode*)malloc(sizeof(ListNode));  
  53.             scanf("%d",&p->value);  
  54.             p->next = NULL;  
  55.             pre->next = p;  
  56.             pre = p;  
  57.         }  
  58.         //全部输出  
  59.         if(n < k){  
  60.             printf("NULL\n");  
  61.         }  
  62.         else{  
  63.             //倒数K个  
  64.             int num = FindKthToTail(head,k);  
  65.             if(num == NULL){  
  66.                 printf("NULL\n");  
  67.             }  
  68.             else{  
  69.                 printf("%d\n",num);  
  70.             }  
  71.         }  
  72.     }  
  73.     return 0;  
  74. }  
0 0
原创粉丝点击