請判斷一個鏈表是否爲迴文鏈表。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
進階:
你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?
代碼
//查找單鏈表中點
function findMid(node){
if(node === null){
return null;
}
let midNode = node;
node = node.next;
while(node !== null && node.next !== null ){
midNode = midNode.next
node = node.next.next;
}
return midNode;
}
//翻轉鏈表
var reverseList = function(head) {
let prevNode = null;
while(head !== null){
//獲取下一個節點
let nextNode = head.next;
head.next = prevNode;
prevNode = head;
head = nextNode;
}
return prevNode;
};
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
if(head === null){
return null;
}
let midNode = findMid(head);
midNode.next = reverseList(midNode.next);
let n1 = head;
let n2 = midNode.next;
while(n1 !== null && n2 !== null && n1.val === n2.val ){
n1 = n1.next;
n2 = n2.next;
}
return n2 === null;
};