旋轉連結串列

小白不败發表於2024-09-15

旋轉連結串列

開頭:
對於連結串列的建立已經熟悉,那我們現在講講旋轉連結串列的如何實現,當然旋轉連結串列的建立是在已經掌握普通連結串列的基礎上講解。
正文:
旋轉連結串列,顧名思義就是讓連結串列“動起來”。即:使連結串列尾部最後的結點轉到連結串列首部的位置。假設已經建立好一條6個結點的連結串列,它的初始狀態如下圖:

我們讓他旋轉兩次就變成了這樣,其過程是這樣的,先讓103到首部,然後再讓22到首部,這樣就是旋轉兩次後的結果。

如果我們讓其旋轉 k次,$k = 2*10^{12}$,最後的結果是怎樣的呢?即,k mod n,其中n是連結串列結點的個數。
下面我們來看程式碼:
void Linklist::Revolve(int ck,int cmaxn)
 {
   count = 0;
   int count2 = 0;
   //建立四個指標
   Node *q1 = new Node;
   Node *q2 = new Node;
   Node *q3 = new Node;
   Node *q4 = new Node;
   q1 = first->next;
   q2 = first->next;  
   q3 = first->next;  
   q4 = first->next;

   int temp = cmaxn - ck;

	//q1的變化
   while(count != temp )
   {
     count++;
     q1 = q1->next;    

   }

	//q2的變化
   q2 = q1;
   while(count2 != ck - 1)
   {
     count2++;
     q2 = q2->next;
   }

	//q3的變化
   count = 0;  
   while(count != temp - 1)
   {
     count++;
     q3 = q3->next;
   }

   q3->next = q2->next;
   first->next = q1;
   q2->next = q4;  
 }

上圖中的圖就是程式碼中的4個指標。指標指向的變化如下圖:

結語:
旋轉連結串列就是透過旋轉次數和節點個數的餘數判斷最終的位置。最多使用四個指標就可以實現旋轉。如有錯誤,請指正,謝謝。

相關文章