• 剑指Offer


    剑指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
    ");
    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
    ", 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 }
  • 相关阅读:
    独立人格,让人生更美好
    版本控制入门简介
    Android蓝牙操作
    Android Rect和RectF的区别
    做个环保主义的程序员
    java/android下JNI编程总结
    别太单纯,也别太不单纯
    C++ namespace的用法
    JNI编程
    企业架构 - 架构原则
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3450580.html
Copyright © 2020-2023  润新知