剑指Offer - 九度1517 - 链表中倒数第k个结点

剑指Offer - 九度1517 - 链表中倒数第k个结点
2013-11-30 02:57
题目描述:

输入一个链表,输出该链表中倒数第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个节点并输出节点值。可以先让一个指针p1从链表头开始跑k歩,然后指针p2指向链表头,两指针同步向前走,当p1走到NULL时,p2即指向倒数第k点。
  不过,既然是处理链表,必然要步步为营,检查指针是否指向NULL。对一切“->”进行指诊检查,确保不发生内存错误。野指针是严重错误,面试里敢犯这等错误的话,估计Offer也就无缘了。
 1 // 651911    zhuli19901106    1517    Accepted    点击此处查看所有case的执行结果    1552KB    1018B    100MS

 2 // 201311152057

 3 #include <cstdio>

 4 #include <cstdlib>

 5 using namespace std;

 6 

 7 struct Node{

 8     int val;

 9     struct Node *next;

10     Node(int _val = 0): val(_val), next(NULL){}

11 };

12 

13 int main()

14 {

15     int n, k, i;

16     int tmp;

17     struct Node *root = NULL;

18     struct Node *tail;

19     struct Node *p1, *p2;

20     

21     root = new Node(0);

22     while(scanf("%d%d", &n, &k) == 2){

23         tail = root;

24         for(i = 0; i < n; ++i){

25             scanf("%d", &tmp);

26             tail->next = new Node(tmp);

27             tail = tail->next;

28         }

29         

30         if(k > n || k < 1 || root->next == NULL){

31             printf("NULL\n");

32             continue;

33         }

34         

35         p1 = p2 = root->next;

36         while(k > 0 && p1 != NULL){

37             --k;

38             p1 = p1->next;

39         }

40         while(p1 != NULL){

41             p1 = p1->next;

42             p2 = p2->next;

43         }

44         printf("%d\n", p2->val);

45         

46         while(root->next != NULL){

47             tail = root->next;

48             root->next = tail->next;

49             delete tail;

50         }

51     }

52     

53     delete root;

54     root = NULL;

55     

56     return 0;

57 }

 

你可能感兴趣的:(链表)