一,題目描述
對於乙個鍊錶,請設計乙個時間複雜度為o(n),額外空間複雜度為o(1)的演算法,判斷其是否為回文結構。給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。測試用例:
1->2->2->1
返回:true
二,解決思路
先找到 a 鍊錶的中間節點
從 b (從中間結點)開始對後面的鍊錶進行逆置操作
分別從 a 和 b 出發, 來依次對比兩個鍊錶的元素是否對應相等.
三,**實現
public
boolean
chkpalindrome
(listnode a)
// 上面的迴圈結束後, b 就指向 a 鍊錶的中間位置了
// 2. 從 b 開始對後面的鍊錶進行逆置操作
listnode prev = null;
listnode cur = b;
while
(cur != null)
//逆置關鍵操作更換指向
cur.next = prev;
prev = cur;
cur = next;
}// 3. 分別從 a 和 b 出發, 來依次對比兩個鍊錶的元素是否對應相等.
// 如果鍊錶的長度為 奇數 個, 那 a 和 b 長度是相同的, 此時無影響
// 如果鍊錶的長度為 偶數 個, 那 a 的長度比 b 要長乙個元素, 就需要注意遍歷的時候迴圈結束條件
// 要以 b 為基準
while
(b != null)
a = a.next;
b = b.next;
}return
true
;}
判斷鍊錶是否為回文結構
給定乙個鍊錶的頭節點 head,請判斷該鍊錶是否為回文 正反結構相同 結構。如果鍊錶長度為 n,時間複雜度達到 o n 額外空間複雜度達到 o 1 參考 程式設計師 面試指南 放入棧,時間複雜度o n 空間複雜度o n bool ispalindrome1 node head while null ...
OJ 判斷鍊錶是否為回文結構
思路 先找到鍊錶的中間節點,然後將鍊錶從中間節點之後的後半段反轉 然後將前半段與後半段逐一進行比較。鍊錶的建立 struct listnode bool ispalindrome struct listnode head 將後半段進行反轉 struct listnode newhead null s...
判斷是否為回文結構
法一 棧 時間o n 空間o n public static boolean ispanlindrome node head second second.next second指向後半部分第乙個元素 stackstack new stack while second null while stack...