問題描述:
拆分單鏈表產生兩個元素數目相等的子鍊錶,維持原鍊錶順序,奇數個元素時第乙個子煉表多乙個元素。當只有乙個元素的時候 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...
帶環單鏈表及單鏈表的相交
帶環單鏈表的概念 當單鏈表的尾指標指向了鍊錶上任一非尾結點時,即生成了乙個帶環單鏈表。問題一 判斷是否帶環 通過快慢指標實現判斷,注意快指標必須是兩步,慢指標必須是一步,否則可能跨過 問題二 求環的入口點 通過數學思想,方法是使用一指標指向開頭,一指標指向環中的相交點,每次各走一步,如此所得相交點即...