迴文鏈表
一、LeetCode題解
瞧一瞧~
- 博健的LeetCode題解:Gitbook版本傳送門
- 博健的LeetCode題解:CSDN傳送門
- 前端進階筆記:Gitbook傳送門
二、算法題
題目
請判斷一個鏈表是否爲迴文鏈表。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
解法一(快慢指針+反轉鏈表)
思路
- 利用快慢指針確定鏈表的中間位置;
- 將鏈表的前半部分進行反轉,與鏈表的後半部分進行比對;
代碼
var isPalindrome = function(head) {
if(!head || !head.next) return true;
var slow = head // 慢指針
var fast = head // 快指針
var prev = null // 保存上一個節點
var temp = null // 保存下一個節點
while(fast && fast.next){
fast = fast.next.next // 快指針走2個節點
temp = slow.next // 慢指針走過得鏈表直接反轉
slow.next = prev
prev = slow
slow = temp // 慢指針走1個節點
}
if(fast){ // 奇數個節點的鏈表
slow = slow.next
}
while(slow){
if(slow.val !== prev.val) return false;
slow = slow.next
prev = prev.next
}
return true
};
結果
解法二(輔助數組+雙指針)
思路
- 將鏈表數據轉換成數字;
- 雙指針,一個在頭,一個在尾對應比較;
代碼
var isPalindrome = function(head) {
if(!head || !head.next) return true; //邊界判斷
var arr = []
while(head){
arr.push(head.val)
head = head.next
} //獲取節點數組
var left = 0, right = arr.length-1
while(left < right){
if(arr[left] !== arr[right]) return false
left++
right--
}
return true
};