您的位置:首页 > 职场人生

链表逆序面试题

2012-05-27 19:20 363 查看
一道面试题:将单向链表按如下规则逆序:

5->4->3->2->1: pHead->5;pStart->3;

逆序结果:3->4->5->1->2 ;

5->4->3->2->1; pHead->5,pStart->1;

逆序结果:1->2->3->4->5;

5->4->3->2->1; pHead->5;pStart->5;

逆序结果:5->1->2->3->4;

要求不能分配新的链表节点,只能使用临时指针变量,将链表按上述规则逆序.

思路:

将pStart后的链表逆序,再将pStart前的链表逆序,然后将pStart后的链表直接接在后面即可;

测试代码如下:

SinglyLinkNode *ReverseNode(SinglyLinkNode *pHead,SinglyLinkNode *pStart)
{
SinglyLinkNode *pTmp=pStart ;
SinglyLinkNode *pTmp1=NULL ;
SinglyLinkNode *pTmp2=NULL ;

if(pTmp->next!=NULL&&pTmp->next->next!=NULL)
{//reverse the latter part
pTmp1=pTmp->next->next->next ;

pTmp2=pTmp->next ;
pTmp->next=pTmp->next->next ;
pTmp->next->next=pTmp2 ;
pTmp2->next=NULL ;
while(pTmp1!=NULL)
{
pTmp2=pTmp1->next ;
pTmp1->next=pTmp->next ;
pTmp->next=pTmp1 ;
pTmp1=pTmp2 ;
}
}
pTmp=pTmp->next ;
if(pHead!=pStart&&pHead!=NULL&&pHead->next!=NULL)
{//reverse forebody
pTmp1=pHead->next ;
pTmp2=pHead->next->next ;
pHead->next=NULL ;
pTmp1->next=pHead ;
pStart->next=pTmp1 ;
while(pTmp2!=pStart)
{
pTmp1=pTmp2 ;
pTmp2=pTmp2->next ;
pTmp1->next=pStart->next ;
pStart->next=pTmp1 ;
}
}
pHead->next=pTmp ;
return pStart ;
}
int main()
{
int a[]={5,4,3,2,1} ;
SinglyLinkNode *pHead=CreateLinkList(a,sizeof(a)/sizeof(a[0])) ;
printf("Origin Order:\n") ;
PrintLinkNode(pHead) ;

SinglyLinkNode *pTmp=GetNode(pHead,0) ;
printf("Node:%d",pTmp->value) ;

pHead=ReverseNode(pHead,pTmp) ;
printf("Reverse Order:\n") ;
PrintLinkNode(pHead) ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: