基於連結串列的奇偶節點的分離演算法分析
阿新 • • 發佈:2020-11-23
基本原理:
通過將連結串列中的奇偶節點依次分離,並存放在兩個新連結串列中,然後將兩個新得到的連結串列拼接,就能得到一條新的分離後的連結串列。
演算法分析:
第一,建立指標(數量隨意)。本題採用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 = newnode; //設定一個空節點,將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返回 }