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