嚴奶奶的第2.37題:設以帶頭結點的雙向循環鏈表表示的線性表L=(a1, a2, … an)。試寫一個時間複雜度爲O(n)的算法 ,將L改造爲L=(a1, a3, …, an, … a4, a2)。
解題思路:按照正常的思路,我們會把偶數位序的結點從左到右依次插入到尾結點之後。因此,尾結點必須固定,再有一個指向偶數位序結點的遍歷結點指針。基本操作即爲:取出偶數位序結點,插入尾結點之後,繼續相同操作。
我們先進行常規處理,如圖:
特殊處理:
- 當只有一個或兩個結點時,不需要進行鏈表操作
具體代碼如下:
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;
}