我理解的剑指Offer--------链表中倒数第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

我的理解:

就是用一把刻度为k的尺子量长度为n的木棍,量好k之后,把尺子平移,到达棍子的尽头。这样尺子的开头就是倒数第k个刻度。


【解析】

我理解的剑指Offer--------链表中倒数第k个结点

我理解的剑指Offer--------链表中倒数第k个结点



【代码】

  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. usingnamespacestd;
  15. typedefstructListNode{
  16. intvalue;
  17. structListNode*next;
  18. }ListNode;
  19. intFindKthToTail(ListNode*head,intk){
  20. //容错处理
  21. if(head==NULL||k<=0){
  22. returnNULL;
  23. }
  24. else{
  25. ListNode*p,*pre;
  26. //带头节点的链表
  27. pre=p=head->next;
  28. //第一个指针向前走k-1步,第二个指针保持不变
  29. for(inti=0;i<k-1;i++){
  30. p=p->next;
  31. }
  32. //两个指针同时向前遍历
  33. while(p->next!=NULL){
  34. pre=pre->next;
  35. p=p->next;
  36. }
  37. returnpre->value;
  38. }
  39. }
  40. intmain()
  41. {
  42. inti,n,k;
  43. while(scanf("%d%d",&n,&k)!=EOF){
  44. ListNode*head,*p,*pre;
  45. head=(ListNode*)malloc(sizeof(ListNode));
  46. head->next=NULL;
  47. pre=head;
  48. for(i=0;i<n;i++){
  49. p=(ListNode*)malloc(sizeof(ListNode));
  50. scanf("%d",&p->value);
  51. p->next=NULL;
  52. pre->next=p;
  53. pre=p;
  54. }
  55. //全部输出
  56. if(n<k){
  57. printf("NULL\n");
  58. }
  59. else{
  60. //倒数K个
  61. intnum=FindKthToTail(head,k);
  62. if(num==NULL){
  63. printf("NULL\n");
  64. }
  65. else{
  66. printf("%d\n",num);
  67. }
  68. }
  69. }
  70. return0;
  71. }