簡單
請判斷一個鏈表是否爲迴文鏈表。示例 1:java
輸入: 1->2 輸出: false
示例 2:指針
輸入: 1->2->2->1 輸出: true
進階: 你可否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?code
對於單鏈表
,迴文
,快慢指針
,鏈表反轉
的考察。blog
「迴文」是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字遊戲,如「我爲人人,人人爲我」等。在數學中也有這樣一類數字有這樣的特徵,成爲迴文數(palindrome number)。 [1] 設n是一任意天然數。若將n的各位數字反向排列所得天然數n1與n相等,則稱n爲一回文數。例如,若n=1234321,則稱n爲一回文數;但若n=1234567,則n不是迴文數。 [1]遊戲
注意:get
鏈表反轉請參考:反轉單鏈表數學
經過兩個快慢指針能夠獲取鏈表中的中間位置節點。(快慢指針步數相差一倍)it
public boolean isPalindrome(ListNode head) { //一、邊界檢查,空鏈表與只有一個節點的鏈表直接返回true if (head == null || head.next == null) { return true; } //二、經過快慢指針找到鏈表中間位置 ListNode fast = head; ListNode slow = head; //當快節點走到終點,則慢節點的位置正好爲鏈表中間 while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } //fast做爲後半段的起始節點 fast = slow; //slow做爲前半段的起始節點 slow = head; //三、反轉後半段鏈表 //定義pre存儲前一個節點 ListNode pre = null; while (fast != null) { //指定當前要調整的點。 ListNode temp = fast; //fast指針後移,走向下一個要被調整的點。 fast = fast.next; //將當前的點反轉 temp.next = pre; //pre指針重置到最前 pre = temp; } //四、對比先後兩段鏈表是否相同 //由於奇數個節點時,後半段鏈表比前半段鏈表多1個,因此循環時之前半段鏈表爲主 while (slow != null && pre != null) { if (slow.val != pre.val) { return false; } slow = slow.next; pre = pre.next; } return true; }