Skip to content
文档章节

BM13 判断一个链表是否为回文结构

描述

给定一个链表,请判断该链表是否为回文结构。

回文是指该字符串正序逆序完全一致。

数据范围: 链表节点数 0 \le n \le 10^50≤n≤105,链表中每个节点的值满足 |val| \le 10^7∣val∣≤107

示例1

输入:{1}

返回值:true

示例2

输入:{2,1}

返回值:false

说明:2->1

示例3

输入:{1,2,2,1}

返回值:true 说明:1->2->2->1

ts
/*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)
 *     }
 * }
 */

/
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
 */
export function isPail(head: ListNode): boolean {
    // write code here
    var stack = [];
    if(!head) return false;
    
    var p = head;
    while(p) {
        stack.push(p);
        p = p.next;
    }
    
    var node;
    while(head) {
        node = stack.pop();
        if(head.val !== node.val) return false;
       head = head.next; 
    }
    return true;
}

方法二

方法一的空间复杂度为,较大,可以使用快慢指针,快指针的速度为慢指针的两倍,当快指针到达链表尾部时,慢指针到达中间位置,将慢指针之后的部分进行反转,再与前半部分进行比较。

具体步骤

  • 如图:

BM13

  • 时间复杂度: O(N),遍历链表
  • 空间复杂度:O(1),常数级空间复杂度
ts
/*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)
 *     }
 * }
 */

/
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
 */
export function isPail(head: ListNode): boolean {
    // write code here
    if(!head) return false;
    
    var fast = head;
    var slow = head;
    while(fast && fast.next) {
        slow = slow.next;
        fast = fast.next.next;
    }
//     链表长度奇数
    if(fast) slow = slow.next;
    
    slow = reverse(slow)
    fast = head;
    
    while(slow) {
        if(slow.val !== fast.val) return false;
        slow = slow.next;
        fast = fast.next;
    }
    return true;
}

function reverse(head: ListNode) : ListNode{
    var prev = null;
    
    while (head) {
        var next = head.next;
        head.next = prev;
        prev = head;
        head = next;
    }
    return prev;
}