一些常見的單鏈表題目,總結思路和實現**。
1.單鏈表的反序
2.給單鏈表建環
3.檢測單鏈表是否有環
4.給單鏈表解環
5.檢測兩條鍊錶是否相交
6.不輸入頭節點,刪除單鏈表的指定節點(只給定待刪除節點指標)
1.單鏈表的反序
[cpp]view plain
copy
//逆轉鍊錶,並返回逆轉後的頭節點
node* reverse(node *head)
node *cur = head;
node *pre = null;
node *tmp;
while
(cur->next)
cur->next = pre; //結束時,操作cur的next逆轉
return
cur;
}
2.給單鏈表建環
[cpp]view plain
copy
//給單鏈表建環,讓尾指標,指向第num個節點,若沒有,返回false
bool
bulid_looplink(node *head,
intnum)
for(i = 1; i < num; ++i)
cur = cur->next;
} tail = cur;
while
(tail->next)
tail->next = cur;
return
true
; }
3.檢測單鏈表是否有環
[cpp]view plain
copy
//檢測單鏈表是否有環,快慢指標
bool
detect_looplink(node *head)
while
(quick_node != slow_node)
if(quick_node != null && slow_node != null)
//非尾節點相遇
return
true
; return
false
; }
4.給單鏈表解環
ps:為了增加節點點陣圖的效率,本應使用hash或則紅黑樹,這裡不造車了,直接用 set容器
[cpp]view plain
copy
//找到有環節點,並解環,找到並解環,返回true,無環,返回false
//思路:先找到環節點:被2個節點指向的節點(一定有環的條件)ps:不考慮中間環,因為只有乙個next節點,只可能是尾環
bool
unloop_link(node *head)
else
//指向已被遍歷過的節點,此時pre節點為尾節點
pre = cur;
cur = cur->next;
} return
false
; }
5.檢測兩條鍊錶是否相交
[cpp]view plain
copy
//檢測兩條鍊錶是否相交,是則返回第乙個交點,否則返回null
//思路:把2個鍊錶各遍歷一遍,記下長度length1和length2,若2者的尾節點指標相等,則相交。
// 之後再把長的鍊錶從abs(len1-len2)的位置開始遍歷,第乙個相等的指標為目標節點
node* detect_intersect_links(node *first_link, node *second_link)
while
(first_link->next || second_link->next)
//遍歷2個鍊錶
if(second_link->next)
} if(first_link != second_link)
//比較尾節點
pos = legnth1 - length2;
if(legnth1 < length2)
//保證 longer_link為長鍊錶
while
(pos-- > 0)
longer_link = longer_link->next;
while
(longer_link || shorter_link)
longer_link = longer_link->next;
shorter_link = shorter_link->next;
} return
null;
}
6.不輸入頭節點,刪除單鏈表的指定節點(只給定待刪除節點指標)
[cpp]view plain
copy
//無頭節點,隨機給出單鏈表中乙個非頭節點,刪除該節點,當傳入空節點,或者尾節點時,返回false
//思路:由於沒有頭節點,非迴圈單鏈表,無法獲取目標節點的前節點,所以只能把它的next節點資料前移,並刪除next節點
//ps:當傳入節點為尾節點,無法用此方法刪除
bool
withouthead_delete_node(node *target_node)
cur = target_node->next;
target_node->name = cur->name;
target_node->next = cur->next;
delete
cur;
return
true
; }
單鏈表的一些常見題目
有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...
單鏈表典型題目
劍指 offer 25.合併兩個排序的鍊錶 劍指 offer 22.鍊錶中倒數第k個節點 劍指 offer 06.從尾到頭列印鍊錶 劍指 offer 141.環形鍊錶 給定鍊錶,請你每隔1個節點輸出1個 如1 3 4 6 11 12 輸出1 4 11 思路 利用棧的特性先進後出,壓入陣列,時間複雜度...
單鏈表常見操作
編譯環境 vs2008 include includetypedef char datatype typedef struct listnodelistnode,linklist 建立乙個空的帶頭結點的鍊錶 linklist createlist 建立乙個非空的鍊錶,頭插法 int createli...