啥是回文结构:一个链表正向看和反向看都是一样的。

例如:1 --> 2 --> 2 --> 1,1 --> 2 --> 3 --> 2 --> 1这样的链表就具备回文结构。

1、额定空间复杂度为O(1)的写法:

(1)找到此链表的中点(偶数个节点则找上中点)

(2)调整链表构造

例如:1 --> 2 --> 3 --> 3 --> 2 --> 1,调整为:1 --> 2 --> 3 <-- 3 <-- 2 <-- 1,上中点3的next节点为null

(3)判断是否为回文结构

(4)将链表调整为原来的构造

(5)返回后果

/** * @author Java和算法学习:周一 */public static class Node {    public int value;    public Node next;    public Node(int v) {        value = v;    }}/** * 额定空间复杂度为O(1) * * 全程只应用了n1、n2、n3三个无限变量 */public static boolean isPalindromeList(Node head) {    // 只有一个节点的链表必定是回文结构    if (head == null || head.next == null) {        return true;    }    // 1.找到此链表的中点(偶数个节点则找上中点)    Node n1 = head;    Node n2 = head;    while (n2.next != null && n2.next.next != null) {        n1 = n1.next;        n2 = n2.next.next;    }    // 此时n1即为中点(偶数个节点则为上中点)    // 2.调整链表构造    // 例如:1 --> 2 --> 3 --> 3 --> 2 --> 1,调整为:1 --> 2 --> 3 <-- 3 <-- 2 <-- 1,上中点3的next节点为null    // n2批改为右半局部的第一个节点    n2 = n1.next;    // 中点(或上中点)的next节点置为null    n1.next = null;    Node n3 = null;    while (n2 != null) {        // 记录此时右半局部节点的next节点        n3 = n2.next;        // 将n2的next节点指向前一个节点        n2.next = n1;        // 调整n1,即n1后移一个节点        n1 = n2;        // 调整n2,即n2到本来n2的后一个节点        n2 = n3;    }    // 此时n1为链表最初一个节点,n2和n3都为null    // 3.判断是否为回文结构    // 记录链表最初一个节点,判断完是否为回文结构后将链表调整回去时须要    n3 = n1;    // n2从右边第一个节点开始,n1从最初一个节点开始    n2 = head;    // 记录是否为回文结构    boolean res = true;    while (n1 != null && n2 != null) {        if (n1.value != n2.value) {            res = false;            // 此处不能间接返回是否为回文结构,还须要将链表调整为原始构造            break;        }        // n1和n2都往两头挪动        n1 = n1.next;        n2 = n2.next;    }    // 4.将链表调整为原来的构造    n1 = n3.next;    // 链表最初一个节点指向null    n3.next = null;    while (n1 != null) {        // 记录next节点        n2 = n1.next;        // n1的next节点指向后一个节点(行将链表调整为原来的构造)        n1.next = n3;        // n3前移        n3 = n1;        // n1前移        n1 = n2;    }    // 调整完后才返回最初的后果    return res;}

2、额定空间复杂度为O(N)的写法:

(1)将链表元素放进栈中,因为栈先进后出,等于把链表翻转了

(2)从原链表头节点开始,挨个和栈弹出的元素进行比拟

(3)每次的值都相等,则是回文结构

/** * 采纳栈来作为对数器。 * * 额定空间复杂度为 O(N) * * @author Java和算法学习:周一 */public static boolean comparator(Node head) {    Stack<Node> stack = new Stack<>();    Node current = head;    while (current != null) {        stack.push(current);        current = current.next;    }    while (head != null) {        if (head.value != stack.pop().value) {            return false;        }        head = head.next;    }    return true;}

本文所有代码:https://github.com/monday-pro/algorithm-study/tree/master/src/basic/node