連結串列題目
題目1
單鏈表是否為迴文結構
方案一: 容器 (犧牲空間複雜度)
把這些元素從頭開始放到棧中,結束以後依次彈出與第一個數相比較
方案二: 快慢指標
快指標一次走兩步,慢指標一次走一步,當快指標為null時,我們找到了連結串列的尾部以及連結串列中間的位置
此時將中間位置的結點指向空,反轉連結串列的右半部分,然後雙指標,對比完將連結串列恢復
如果連結串列的結點為偶數,當快指標跳出時,慢指標就不動了,此時慢指標指向的就當作中間結點
題目2
將單向連結串列按某值劃分成左邊小、中間相等、右邊大的形式
方案一: 陣列 (犧牲空間複雜度)
遍歷連結串列到陣列,之後再使用荷蘭國旗
方案二: 使用額外變數
因為需要劃分為3個區域,每個區域中設定兩個變數分別為:頭結點和尾結點,接下來遍歷原連結串列,頭結點和尾結點指向第一次符合要求的結點,之後將第一個符合要求的元素指向第二個符合要求的結點,將尾結點指向第二個結點,以此類推,最後將第一個區域的尾結點指向第二個區域的頭結點,第二個區域的尾結點指向第三個區域的頭結點。
複製含有隨機指標的結點
方案一: 雜湊表
遍歷一遍老連結串列,將老連結串列的結點對映到map的key,結束後再遍歷老連結串列得到老連結串列的next和random,對映到map的value
方案二: 另一種擺放位置
遍歷一遍連結串列後,將新結點放在每一個相對應的老結點的後面,利用一個新的結構的擺放,來代替雜湊表,方便查詢新結點的位置,再遍歷老結點,新結點的random指向的是老結點random的下一個結點,即克隆結點相對應的結點。
兩個單鏈表相交的一系列問題
連結串列是否有環
方案一: 雜湊表
遍歷連結串列並且set到map中,如果後續發現遍歷的連結串列map中有,則連結串列是有環的,如果遍歷到空,沒有發現,則說明沒有環
方案二: 快慢指標
- 快慢指標從頭部出發,快指標一次走兩步,慢指標一次走一步
- 如果快指標null,則無環; 如果一直沒遇到null,則有環,如果有環,快指標則會在環上遇到慢指標
- 遇到後:快指標回到頭部,一次走一步,慢指標在原地開始一次走一步
- 當兩者再次遇到時,就是環的入口
兩連結串列相交的問題
頭結點分別為head1,head2
分別取得兩連結串列的入環結點
loop1
loop2
方案一: 雜湊表
將連結串列一註冊到雜湊表,再遍歷連結串列二
方案二:
遍歷連結串列一,找到他的最後一個結點,並統計長度;連結串列二同上。如果兩個連結串列相交,那麼他們最後一個結點記憶體地址一定相同。如果相同,那麼這是他們相交部分最後一個結點,那怎麼求第一個相交結點呢?讓長連結串列先走,直到剩下的和短連結串列的長度相同,兩連結串列再一起走