LeetCode題解:234.迴文鏈表

迴文鏈表

一、LeetCode題解

瞧一瞧~

二、算法題

題目

請判斷一個鏈表是否爲迴文鏈表。

示例 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
};
結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章