雙循環鏈表奇偶位序結點排序

嚴奶奶的第2.37題:設以帶頭結點的雙向循環鏈表表示的線性表L=(a1, a2, … an)。試寫一個時間複雜度爲O(n)的算法 ,將L改造爲L=(a1, a3, …, an, … a4, a2)。

解題思路:按照正常的思路,我們會把偶數位序的結點從左到右依次插入到尾結點之後。因此,尾結點必須固定,再有一個指向偶數位序結點的遍歷結點指針。基本操作即爲:取出偶數位序結點,插入尾結點之後,繼續相同操作。

我們先進行常規處理,如圖:

img

特殊處理:

  • 當只有一個或兩個結點時,不需要進行鏈表操作

具體代碼如下:

Status Algo(DuLinkList L)
{
    //p:指向偶數位序的遍歷結點
    //head:指向奇數位序的遍歷結點
    //tail:指向原鏈表的尾結點,固定不變
    DuLinkList p,head,tail;

    head = L->next;
    tail = L->prior;

    while(head != tail)         //鏈表不只有一個元素,遍歷整個鏈表
    {
        if(head->next != tail)  //鏈表不只有兩個元素
        {
            //指向偶數位序結點
            p = head->next;

            //取出偶數位序結點
            p->prior->next = p->next;
            p->next->prior = p->prior;

            //插入到固定尾結點之後
            p->next = tail->next;
            p->prior = tail;
            tail->next = p;

            //指向下一奇數位序結點
            head = head->next;
        }
        else break;             //鏈表只有兩個元素則退出循環
    }

    return OK;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章