题目:给你一个单链表的头节点?head ?,请你判断该链表是否为回文链表。如果是,返回?true ?;否则,返回?false ?。
例 1:
输入:head = [1,2,2,1] 输出:true 示例 2:
输入:head = [1,2] 输出:false ?
提示:
链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9 ?
进阶:你能否用?O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/palindrome-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
三个循环,先找中点,然后在把后面的一般翻转,之后从两头判断,
有个疑问,这样会破坏链表结构呢。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
let que = []
let midNode = head
let endNode =head
if(!head.next){
return true
}
while(endNode.next){
endNode = endNode.next
if(endNode.next){
endNode = endNode.next;
midNode = midNode.next;
}
}
let tmp = midNode.next;
midNode.next = null
while(tmp){
let head2 = tmp.next;
tmp.next = midNode
midNode = tmp
tmp = head2
}
while(midNode && head){
if(midNode.val === head.val){
head = head.next;
midNode = midNode.next;
}else{
return false
}
}
return true
};
|