判斷是否是迴文鏈表,儘量在O(n)時間複雜度。
思路:
快慢指針,慢指針指向的前面一部分序列倒序(從後向前指)。當快指針到頭時剛好慢指針把前一半倒序。
此時Pre指針指向的是前面一般=半鏈表的倒敘的頭, 慢指針指向後面一半的頭。
注意如果循環結束時快指針不是空則說明鏈表節點數是奇數個,那slow指針要向前移一個。還有循環判斷條件應該是next 和next.next
還有要先更改快指針,否則會收到慢指針的影響。
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode slow=head, fast=head, pre=null;
while(fast!=null && fast.next!=null){
fast = fast.next.next;
ListNode tmp = slow.next;
slow.next = pre;
pre = slow;
slow = tmp;
}
if(fast!=null){
slow = slow.next;
}
while(pre!=null && slow!=null){
if(pre.val != slow.val)
return false;
pre = pre.next;
slow = slow.next;
}
return true;
}
}