3-7(單鏈表的相關算法題)

今天仍是繼續刷單鏈表的相關算法題
一、鏈表分割:就是將一個鏈表的值按照小於x或者大於等於x排序,但不改變相對位置。如鏈表1-3-5-2-6-7-4.x==4
排序後的單鏈表應該爲1-3-2-5-6-7-4;
思想:定義2個頭結點lesshead,greathead,而且須要2個尾節點lesstail,greattail;這個方面須要注意一點就是頭結點的定義不是和指針定義同樣,節點的定義須要malloc申請,listnode lesshead=(listnode)malloc(sizeof(listnode));第二步須要定義一個cur指針指向須要分割的鏈表,並將其每一個節點的元素值與x比較,小於x的用尾插法插到lesstail後面,別的插到greattail的後面。這裏買呢而後再將lesstail->next=greathead->next; greattail->next=NULL;必定須要將greattail->next=NULL,由於greattail做爲新排序的尾部。
二、鏈表的迴文結構(對稱結構)如1-2-3-2-1;1-2-2-1.這樣都是迴文結構,
思想:利用快慢指針,來將鏈表中間分割,在將後半部逆序,和前半部的值一一比較,若是同樣,就爲迴文結構。
須要注意一點就是記得定義一個Prev指針,來指向中間指針的前一個,由於須要將中間指針的前一個置爲空。
三、相交鏈表:找到2個鏈表相交的起始節點
思想:2個鏈表相交,也就是2個鏈表有個共同的節點,也就是tail地址同樣。
第一步:遍歷2個鏈表,求出其2個鏈表的長度la,lb。利用abs(la-lb)求出這2個鏈表的差值的絕對值,第二步將長的鏈表獨自移動abs位,這樣就能夠保證其2個鏈表的長度同樣,就能夠一一比較2個鏈表的地址。爲何須要移動長鏈表到2個鏈表長度同樣呢?答:由於 相交說明2個鏈表有個共同節點,也就是2個鏈表都存儲了其地址值,因此須要一一對比,
四、環形結構:判斷一個鏈表是否有環:
思想:快慢指針思想,將快指針一次移動2個節點,慢指針一次移動一個節點,若是有環,快指針一定會在環裏面與慢指針相遇,假設快慢指針相距x,每走一次距離會縮短1,終會出現x等於0,因此一定有環,至於快指針一次爲何走2個節點,由於走3個節點或者n個節點都有可能使其2個指針遇不到。node

五、環形結構Ⅱ:輸出一個環形的人口節點
思想:一:利用假設在某個節點相遇,則將該節點前面的做爲一部分,後面的做爲一部分,將先後2部分做爲2個鏈表,而後利用相交能夠求出其入口。
二:利用快慢指針,找到相遇節點,而後利用數學距離公式,能夠求人口算法

相關文章
相關標籤/搜索