鏈表演算法題目
① 已知一個帶頭節點的非空單鏈表L,請編寫演算法實現將第一個節點移動到表尾
以下是代碼:
Node *p=L;//定義臨時對象指針
while(p->next) p=p->next;//找到最後結點
if(p!=L->next) //如果只有一個結點就不移
{
p->next=L->next;//最後結點指向第一結點
L->next=L->next->next;//第二結點變為第一結點
L->next->next=NULL;//原第一結點已經是最後結點,設置最後結點的下一結點為NULL
}
② 有兩個帶頭結點的單循環鏈表L1和L2,編寫演算法將鏈表L2鏈接到鏈表L1之後成為一個單循環鏈表
list * connect(list* L1,list* L2)
{
list * p=L1
while(p->next)
p=p->next; //找到L1最後一個節點
p->next=L2->next; //把L2的節點連到L1的末端
while(p->next)
p=p->next; //找到L2最後一個節點
p->next=L1; //將next指向L1頭節點,形成循環鏈表
return L1;
}
③ 請教一道數據結構的演算法題演算法具體描述如下: 設以帶頭結點的雙向循環鏈表L=(a1,a2,....,an).試寫一個時
有兩種思想供參考:(1)
整體思想
(2)化整為零
先來說說整體思想,我們可以發現序號為奇數的元素的前後相對位置未變,只是偶數位置有變化。這樣的話,我們可以將偶數按序號
逆序
(由大到小)插入到
鏈表
尾部。考慮到
時間復雜度
問題,在搜索偶數的過程中,可以先找到最大的偶數序號+1的位置(是個奇數,奇數相對位置不動),記下它的位置為L,L向前指的那個位置是偶數位置。這樣再找下一個時,直接用L-2,直至k-2等於3為止即可找到所有序號為偶數的位置。
怎麼化整為零呢?先來看看下面這個過程:
null
1
2
(1是從head的後面插入鏈表,2是從tail的前面插入鏈表)
1
3
2
(3是從1的後面插入鏈表)
1
3
4
2(4是從2的前面插入鏈表)
1
3
5
4
2(5是從3的後面插入鏈表)
......
1
3
5
...
n
...
6
4
2
由此,我們可以設置2個指針p,q,分別指向剛剛序號為奇數的元素插入的位置和剛剛序號為奇數的元素插入的位置,下一個序號為奇數的元素插入到p後,為偶數的插入到q前,並隨著插入的過程實時變化p,q,最後再將q和q指向的元素之間的2個指針接上就OK了。
程序交給你來寫吧,應該不太難。