408 2019算法題目


算法基本思想:分三步完成:

第一步:采用兩個指針交替前行,找到單鏈表中間節點

第二步:將單鏈表后半段節點原地逆置

第三步:從單鏈表前后兩段各取一個節點,按要求重排

代碼實現:

void change_list(Node  *h)
{
    Node *p,*q,*r,*s;
    p=q=h;
    while(q->next!=null)//尋找中間節點
    {
        p=p->next;//p走一步
        q=q->next;
        if(q->next!=NULL)q=q->next;//q走兩步
    }
    q=p->next//p所指即為中間節點,q為后半段鏈表首節點
    p->next=NULL;
    while(q!=NULL)
    {
        r=q->next;
        q->next=p->next;
        p->next=p;
        q=r;
    }//將鏈表后半段逆置
    s=h->next;//s指向前半段的第一個節點,即插入點
    q=p->next;//q指向后半段第一個節點
    p->next=NUll;
    while(q!=NULL)//將鏈表后半段節點插到指定位置
    {
        r=q->next;//r指向后半段的下一個節點
        q->next=s->next;//將q所指節點插入到s節點之后
        s->next=q;
        s=q->next;//s指向前半段下一個插入點
        q=r;
    }
}

    

  算法復雜度為O(N)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM