剑指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


Code:
#include <iostream>
 
using namespace std;
 
struct Node{
    int data;
    Node *next;
};
 
 
/*思想:设置2个指针L_head和L_behind,初始化时都指向头
结点的后一个结点(L->next),令L_head先走k-1步,L_head和L_behind
再一起向后遍历,当L_head到了最后一个结点的时候,L_behind
此时就指向倒数第k个结点*/
int main()
{
    int n,k;
    while(cin>>n>>k){
        Node *L=new Node;
        L->next=NULL;
        Node *pre=L;
        Node *L_head,*L_behind;
        int cnt;
        for(int i=0;i<n;i++){
            Node *p=new Node;
            p->next=NULL;
            int x;
            cin>>x;
            p->data=x;
            pre->next=p;
            pre=p;
        }
        if(k==0||k>n){
            cout<<"NULL"<<endl;
            continue;
        }
        L_head=L_behind=L->next;
        cnt=1;
        while(cnt<=k){
            L_head=L_head->next;
            ++cnt;
        }
        while(L_head!=NULL){
            L_head=L_head->next;
            L_behind=L_behind->next;
        }
        cout<<L_behind->data<<endl;
    }
    return 0;
}
 
/**************************************************************
    Problem: 1517
    User: lcyvino
    Language: C++
    Result: Accepted
    Time:200 ms
    Memory:3104 kb
****************************************************************/



原文地址:https://www.cnblogs.com/Murcielago/p/4143258.html