1. 程式人生 > 實用技巧 >基於連結串列的奇偶節點的分離演算法分析

基於連結串列的奇偶節點的分離演算法分析

基本原理:

  通過將連結串列中的奇偶節點依次分離,並存放在兩個新連結串列中,然後將兩個新得到的連結串列拼接,就能得到一條新的分離後的連結串列。

演算法分析:

  第一,建立指標(數量隨意)。本題採用5個指標,分別用來:p用來存放連結串列,q1和q11用來存放奇節點,q2和q22用來存放偶節點;

  第二,將指標賦予其意義。q11和q22分別用來存放頭節點;

  第三,通過判斷p指標是否為空,來控制函式是否進入迴圈體;

  第四,判斷是哪一種節點,然後根據判斷結果,將p當前的節點賦值給相應的指標,並將操作過的指標下移;

  第五,依次執行第四步驟,直到迴圈結束;

  第六,將奇偶節點拼接,併為尾節點賦值為空;

  第七,返回新連結串列;

程式碼展示:

//通過指標型函式,將分離後的連結串列返回;也可以

//本函式僅僅包含了函式功能的實現,並不支援輸出

link solve(link L)
{
    link p, q1, q11, q2, q22;   //定義連結串列指標,p用來存放連結串列,q1和q11用來存放奇節點,q2和q22用來存放偶節點;
    int j = 1;                  //定義一個變數,作用為描述節點的位置
    p = L->next;                //將連結串列的第一個有效資料的節點賦值給p指標
    q1 = new node; q2 = new
node; //設定一個空節點,將q1和q2分別指向該節點 q1->next = q2->next = NULL; //將q1和q2下一個節點指向空 q11 = q1; q22 = q2; //儲存q1和q2的頭節點,並存放在q11和q22 while (p) { //判斷p是否為空,如果不為空則進入迴圈 if (j++ % 2 == 0) //判斷是否為偶節點,如果是,則執行下面括號內的語句 { q2->next = p; //
將p當前的節點賦值給q2的下一個節點 q2 = p; //將q2指標後移一個單位 } else { //否則,則執行下面括號內的語句 q1->next = p; //將p當前的節點賦值給q1的下一個節點 q1 = p; //將q1指標後移一個單位 } p = p->next; //將p指向下一個節點 } q2->next = NULL; //將q2的尾節點指向空 q1->next = q22->next; //將q2的頭節點q22接到q1尾節點的後面 return q11; //將q1的頭節點q11返回 }