1. 程式人生 > 其它 >連結串列題目

連結串列題目

題目1

單鏈表是否為迴文結構

方案一: 容器 (犧牲空間複雜度)

把這些元素從頭開始放到棧中,結束以後依次彈出與第一個數相比較

方案二: 快慢指標

快指標一次走兩步,慢指標一次走一步,當快指標為null時,我們找到了連結串列的尾部以及連結串列中間的位置

此時將中間位置的結點指向空,反轉連結串列的右半部分,然後雙指標,對比完將連結串列恢復

如果連結串列的結點為偶數,當快指標跳出時,慢指標就不動了,此時慢指標指向的就當作中間結點

題目2

將單向連結串列按某值劃分成左邊小、中間相等、右邊大的形式

方案一: 陣列 (犧牲空間複雜度)

遍歷連結串列到陣列,之後再使用荷蘭國旗

方案二: 使用額外變數

因為需要劃分為3個區域,每個區域中設定兩個變數分別為:頭結點和尾結點,接下來遍歷原連結串列,頭結點和尾結點指向第一次符合要求的結點,之後將第一個符合要求的元素指向第二個符合要求的結點,將尾結點指向第二個結點,以此類推,最後將第一個區域的尾結點指向第二個區域的頭結點,第二個區域的尾結點指向第三個區域的頭結點。

複製含有隨機指標的結點

方案一: 雜湊表

遍歷一遍老連結串列,將老連結串列的結點對映到map的key,結束後再遍歷老連結串列得到老連結串列的next和random,對映到map的value

方案二: 另一種擺放位置

遍歷一遍連結串列後,將新結點放在每一個相對應的老結點的後面,利用一個新的結構的擺放,來代替雜湊表,方便查詢新結點的位置,再遍歷老結點,新結點的random指向的是老結點random的下一個結點,即克隆結點相對應的結點。

兩個單鏈表相交的一系列問題

連結串列是否有環

方案一: 雜湊表

遍歷連結串列並且set到map中,如果後續發現遍歷的連結串列map中有,則連結串列是有環的,如果遍歷到空,沒有發現,則說明沒有環

方案二: 快慢指標

  • 快慢指標從頭部出發,快指標一次走兩步,慢指標一次走一步
  • 如果快指標null,則無環; 如果一直沒遇到null,則有環,如果有環,快指標則會在環上遇到慢指標
  • 遇到後:快指標回到頭部,一次走一步,慢指標在原地開始一次走一步
  • 當兩者再次遇到時,就是環的入口

兩連結串列相交的問題

頭結點分別為head1,head2

分別取得兩連結串列的入環結點loop1 loop2

方案一: 雜湊表

將連結串列一註冊到雜湊表,再遍歷連結串列二

方案二:

遍歷連結串列一,找到他的最後一個結點,並統計長度;連結串列二同上。如果兩個連結串列相交,那麼他們最後一個結點記憶體地址一定相同。如果相同,那麼這是他們相交部分最後一個結點,那怎麼求第一個相交結點呢?讓長連結串列先走,直到剩下的和短連結串列的長度相同,兩連結串列再一起走