给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例:
提示:
- 链表中节点数目在范围[1, 105] 内
- 0 <= Node.val <= 9
思路:
- 双指针
- 翻转后半部分链表,然后从表头
- 翻转链表的三种方法:(1)栈;(2)双链表(3)递归【还可以反向输出单链表】;
- 本题试用双链表
- 如果链表为空或者只有一个节点直接返回 true ;
- 翻转后半部分将 fast 指针指向初始 head 头结点 ;
- 依次比对 fast 和 slow 指针的,不相同直接返回 false ;
- slow 指针走到最后返回 true ;
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function isPalindrome(head: ListNode | null): boolean {
if(head == null || head.next == null)
return true;
var slow = head;
var fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
//链表的长度是奇数个
if (fast != null) {
slow = slow.next;
}
slow = reverse(slow);
fast = head;
while(slow != null) {
if(fast.val != slow.val)
return false;
slow = slow.next;
fast = fast.next;
}
return true;
};
function reverse(node: ListNode | null): ListNode | null {
var reverseList: ListNode = null;
while (node != null) {
let nextNode = node.next;
node.next = reverseList;
reverseList = node;
node = nextNode;
}
return reverseList;
}