JAVA-牛客-判斷連結串列的迴文結構
阿新 • • 發佈:2021-01-17
判斷連結串列的迴文結構
1.題目
對於一個連結串列,請設計一個時間複雜度為O(n),額外空間複雜度為O(1)的演算法,判斷其是否為迴文結構。
給定一個連結串列的頭指標A,請返回一個bool值,代表其是否為迴文結構。保證連結串列長度小於等於900。
測試樣例:
1->2->2->1
返回:true
2.分析
對於一個迴文連結串列可以發現,當指標節點在對其進行遍歷時,走到中間位置就等同於從中間倒著往前走
如 1->2->3->2->1,1->2->2->1
因此可以將中間以後的部分進行反轉,就能得到一個和前半部分相同的連結串列,這也變成了判斷迴文結構的條件
3.程式碼示例
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
if(A==null||A.next==null){
return false;
}
if(A.next.next==null){
return false;
}
//首先定義快慢指標得到連結串列的中間節點
ListNode slow = A;
ListNode fast = A;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//從連結串列的中間開始反轉後續連結串列
ListNode tmp = slow;
ListNode cur = slow.next;
ListNode curNext = cur.next;
while(curNext!=null){
cur.next=tmp;
tmp=cur;
cur=curNext;
curNext=curNext.next;
}
slow.next=null;
cur.next=tmp;
//逐個對比前半部分連結串列和後半部分連結串列的反轉
while(cur!=null){
if(cur.val!=A.val){
return false;
}
cur=cur.next;
A=A.next;
}
return true;
}
}