现在的位置: 首页 > 综合 > 正文

链表逆序面试题

2018年03月16日 ⁄ 综合 ⁄ 共 1283字 ⁄ 字号 评论关闭

一道面试题:将单向链表按如下规则逆序:
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) ;
}

抱歉!评论已关闭.