读书人

【融博笔考题】查找单链表倒数第k个结

发布时间: 2013-03-21 10:08:17 作者: rapoo

【融博笔试题】查找单链表倒数第k个结点的值

继华赛之后,又一次倒在面试门前。基础不扎实就是不行啊!

下来做完这道题,顺便复习单链表。代码如下:

//---------------------------------------#include <iostream>using namespace std;//融博C++笔试题//单链表中找出倒数第k个结点的值//最后一个结点指向NULL//---------------------------------------typedef int elemType;typedef struct LinkNode{    elemType data;    LinkNode* next;}*L;int cnt;     //结点个数//---------------------------------------//创建链表void Create(LinkNode *L){    L->next=NULL;    cin>>L->data;    LinkNode *r=L;        while( 1 )    {        LinkNode *p=new LinkNode;   //when delete?        cin>>p->data;                if ( getchar() =='#' )            break;        p->next=NULL;        r->next=p;        r=p;        }}//---------------------------------------//遍历链表void display(LinkNode *L, int &cnt)           {    cnt=0;    LinkNode *p=L;    while ( p->next != NULL )    {        cout<<p->data<<' ';        p=p->next;        cnt++;    }    cout<<p->data<<' ';    cnt++;}//---------------------------------------//销毁链表void distruct(LinkNode *L)      //按节点删除,还是删除头即可?应该是前者吧,否则造成内存泄漏{    int c=0;    while (L->next)    {        LinkNode *r=L;        LinkNode *p=L->next;        while ( p->next )        {            r=p;            p=p->next;        }        cout<<p->data<<' ';        delete p;        c++;        r->next=NULL;    }    cout<<L->data<<endl;    delete L;    c++;    if(c==cnt)        cout<<"链表L已销毁!"<<endl;    else        exit(0);}//---------------------------------------//查找链表中倒数第k个结点的值  int findK(LinkNode* L, int k){    if ( k>cnt || k<1 )    {        cout<<endl<<"超出限制的k值";        return -9999;    }                 LinkNode *p=L;    int m=1;    while(m++<cnt-k+1)    {        p=p->next;        }         return p->data; }                    //---------------------------------------int main(int argc, char* argv[]){    LinkNode *L= new LinkNode;          Create(L);    display(L, cnt);    //查找倒数第k个结点,cin有误,百度了一下像下面这样解决:    cin.clear();    //错误位重置,这句话一定要写的    cin.sync();     //清空缓存区,还可以用fflush(stdin);                    //也可以用cin.ignore(),但这个只清除一个字符    int k;    cout<<endl<<"查找倒数第k个结点的值,请输入k:";    cin>>k;    int val = findK(L, k);    cout<<"倒数第"<<k<<"个结点的值为"<<val<<endl;    ///////////////////    distruct(L);                  return 0;}//---------------------------------------


能力有限,理解得到位的,不到位的,都写在注释里了。错误之处请指出,谢谢!

读书人网 >编程

热点推荐