題目:請編寫乙個函式,檢查鍊錶是否為回文。給定乙個鍊錶listnode* phead,請返回乙個bool,代表鍊錶是否為回文。測試樣例:返回:true返回:false
思路:判斷回文是字串中也經常會出現的乙個問題,邏輯並不複雜:對於字串,如果是數字判斷回文,可以迴圈使用取模運算和取餘運算來判斷是否相同;對於字元,怎麼判斷?
鍊錶中的值通常都是數字,因此對於這樣的鍊錶判斷回文類似於對數字判斷是否是回文。
方法一:時間複雜度
o(n),
空間複雜度
o(n)—
利用棧裝載
n個結點
先遍歷一遍鍊錶12321,將結點分別裝入棧中,然後再次遍歷鍊錶12321同時從棧中彈出結點12321,由於棧起到反向的作用,因此如果兩者相同說明是回文結構,這裡無論結點是奇數還是偶數都沒有關係。只是棧中裝入n個結點需要額外占用空間複雜度o(n)。
方法二:時間複雜度
o(n),
空間複雜度
o(n/2)—
利用棧裝載
n/2個結點
也是使用棧,使用兩個指標pfast,pslow對鍊錶1234567進行遍歷,在遍歷同時將pslow遍歷的結點放入到棧中321,當pfast遍歷結束時,pslow剛好到達中間,於是鍊錶的前面一半已經放入到棧中,剛好是前面一半的逆序321,之後慢指標pslow繼續遍歷,同時從棧中彈出結點進行比較,相當於將鍊錶的前面一半折過來與後面的一半鍊錶進行比較。
就是對於鍊錶是基數還是偶數的操作有一些區別:
如果是基數,即pfast.next==null時第一遍遍歷結束,此時pslow在正中間4結點,此時不要將這個結點放入到棧中,之後分別彈棧和遍歷pslow進行比較。
方法三:時間複雜度
o(n),
空間複雜度
o(1),
對後面半條逆序
,之後兩個指標分別從頭尾遍歷
先找到中間結點,即通過pslow和pfast進行遍歷,當pfast.next==null(奇)或者pfast.next.next==null(偶)即說明pfast到達尾部,此時pslow到達中部,將此時的中間結點單獨記錄pmiddle,同時記錄開始的頭結點phead,然後使用指標pmiddle開始對後面的鍊錶進行逆序(逆序保留三個結點即可)
然後從頭結點p1和尾部結點開始進行遍歷,逐個比較值,直到p1==pmiddle為止。
這裡關鍵是對奇數和偶數情況下的不同處理會帶來麻煩。
//①先找到鍊錶的中間結點pmiddle
listnode pslow=phead;
listnode pfast=phead;
//常識:&&只要第乙個條件不滿足,後面條件就不再判斷,這裡恰好當pfast.next==null時就不會比較pfast.next.next從而避免了空指標
while(pfast.next!=null&&pfast.next.next!=null)
//此時pslow所在的位置就是中間結點
listnode pmiddle=pslow;
//②對pmiddle之後的鍊錶進行逆序
listnode ppre=pmiddle;
listnode pcur=ppre.next;
listnode pnext=null;
while(pcur!=null)
//此時完成遍歷且ppre就是尾結點
listnode ptail=ppre;
listnode phead=phead;
//③從頭尾同時開始進行遍歷比較,由規律可知在奇偶狀態下,phead先或者同時到達pmiddle
while(phead!=pmiddle)
return true;}}
鍊錶回文結構
對於乙個鍊錶,請設計乙個時間複雜度為o n 額外空間複雜度為o 1 的演算法,判斷其是否為回文結構。給定乙個鍊錶的頭指標head,請返回乙個bool值,代表其是否為回文結構。思路 實現 public class palindromelist 此時slow位於鍊錶中間,開始反轉鍊錶slow後面的部分 ...
鍊錶回文結構
對於乙個鍊錶,請設計乙個時間複雜度為o n 額外空間複雜度為o 1 的演算法,判斷其是否為回文結構。給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。測試樣例 1 2 2 1返回 true解題思路 1 找到鍊錶的中點,2 翻轉後半部分的鍊錶節點 3 依次...
鍊錶的回文結構
題目描述 對於乙個鍊錶,請設計乙個時間複雜度為o n 額外空間複雜度為o 1 的演算法,判斷其是否為回文結構。給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。測試樣例 1 2 2 1 返回 true 大體思路 通過快慢指標法得到mid 慢的依次存入棧 ...