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

来源:互联网 发布:linux 拷贝命令 编辑:程序博客网 时间:2024/06/06 15:45

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

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

 

//---------------------------------------------------------------------------#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;}//---------------------------------------------------------------------------


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

原创粉丝点击