您的位置:首页 > 其它

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

2013-03-19 21:02 211 查看
继华赛之后,又一次倒在面试门前。基础不扎实就是不行啊!

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

//---------------------------------------------------------------------------

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


能力有限,理解得到位的,不到位的,都写在注释里了。错误之处请指出,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: