單鏈表的分隔

2021-06-22 18:20:23 字數 1274 閱讀 6759

問題描述:

拆分單鏈表產生兩個元素數目相等的子鍊錶,維持原鍊錶順序,奇數個元素時第乙個子煉表多乙個元素。當只有乙個元素的時候 back == null。

第一種方案:先整個遍歷鍊錶統計鍊錶節點總數目,按照節點的數目進行劃分

/* 

* 將單鏈表進行拆分,分為兩部分,兩部分元素數目相等, 總數是奇數時,前部分多乙個

* 思路: 1. 先統計總數目。 2. 在進行劃分

* 思路非常直觀,**易於書寫。當n很大時效率不高。

*/void partition_bruteforce(node *head, node * &front, node * &back)

int n = 0;

node *p = null;

for (p = head; p; n++,p = p->next); /* 統計鍊錶中節點的個數 */

int c = n / 2 + n % 2; /* 前半段中的元素數目,據此進行劃分*/

int i;

node *tail = null;

for (i = 0, p = head; i != c; i++, tail = p, p = p->next); /* 進行計數切分 */

if (tail) tail->next = null;

front = head;

back = p;

}

第二種方案:採用slow pointer, fast pointer 的方式進行遍歷

/*

* 將單鏈表進行拆分,分為兩部分,兩部分元素數目相等, 總數是奇數時,前部分多乙個。

* 思路:

* 1. 設定快慢指標,快指標的速度是慢指標的2倍。

* 2. 快指標訪問結束的時候,慢指標恰好在後半段的開頭。

* * 思路非常直觀,**易於書寫,更有效率。 但是觀察到這一現象並不容易。

* 要注意多多思考,不要只拘泥於已經有的方案。

****/

void partition_smart(node *head, node * &front, node * &back)

node *slow, *fast;

slow = fast = head;

node *tail = null;

while (fast)

tail->next = null;

front = head;

back = slow;

}

單鏈表(合併單鏈表)

單鏈表遍歷 單鏈表遍歷是從單鏈表頭指標head開始訪問,沿著next指標所指示的方向依次訪問每乙個結點,且每個結點只能訪問依次,直到最後乙個結點為止。遍歷時注意,不要改變head指標的指向。因此一般設定另外的乙個指標變數如p,p從head開始依次訪問乙個結點,直到鍊錶結束,此時p null,完成依次...

單鏈表之排序單鏈表

package list public class sortedsinglylist extends singlylist 將values陣列中的所有物件按值大小插入 public sortedsinglylist t values 過載深拷貝,由單鏈表構建排序單鏈表 public sortedsi...

帶環單鏈表及單鏈表的相交

帶環單鏈表的概念 當單鏈表的尾指標指向了鍊錶上任一非尾結點時,即生成了乙個帶環單鏈表。問題一 判斷是否帶環 通過快慢指標實現判斷,注意快指標必須是兩步,慢指標必須是一步,否則可能跨過 問題二 求環的入口點 通過數學思想,方法是使用一指標指向開頭,一指標指向環中的相交點,每次各走一步,如此所得相交點即...