問題描述
編寫一個函數,檢查輸入的鏈表是否是迴文的。
示例:
輸入: 1->2
輸出: false
輸入: 1->2->2->1
輸出: true
方法一
/**
* 要求時間複雜度爲O(n),空間複雜度爲O(1)
*1.獲取中間位置
* 獲取中間位置,可以通過快慢指針實現
*2.從中間位置一次向兩側對比
* 從中間向兩側對比,需要將左半部分進行翻轉,才能夠實現
*/
public boolean isPalindrome(ListNode head) {
if(head==null){
return true;
}
//1.獲取中間位置
//獲取中間位置,可以通過快慢指針實現
ListNode slow = head;
ListNode fast = head;
//左側鏈表翻轉後的頭部
ListNode pre = null;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
//記錄下一個節點
ListNode tmpNextForSlow = slow.next;
//slow結點針對於pre是頭部插入
slow.next = pre;
pre = slow;
//將slow指向下一個結點
slow = tmpNextForSlow;
}
ListNode right;
//判斷當前的鏈表長度是奇數還是偶數
//1->2->3 如果fast有值,則爲奇數長度.pre 指向1 ,slow指向2,那麼需要right指向3即可
//1->2->3->4 如果fast有值,則爲奇數長度.pre 指向2,slow指向3,那麼需要right=slow即可
if(fast!=null){
right = slow.next;
}else{
right = slow;
}
//2.從中間位置一次向兩側對比
//從中間向兩側對比,需要將左半部分進行翻轉,才能夠實現
while(right!=null&&pre!=null){
if(right.val!=pre.val){
return false;
}
right = right.next;
pre = pre.next;
}
return true;
}