【题目】 给定一个链表的头节点head,请判断该链表是否为回文结构。如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)
例如:
1->2->1,返回true
1->2->2->1,返回true
15->6->15,返回true
1->2->3,
public static boolean method01(Node<Integer> head) {
Node<Integer> n1 = head;
Node<Integer> n2 = head;
while (n1.next != null && n2.next.next != null) { // 查找中间节点
n1 = n1.next; // 中部
n2 = n2.next.next; //结尾
}
n2 = n1.next; // 右半部分的起始节点
n1.next = null; // mid.next -> null
Node<Integer> n3 = null;
while (n2 != null) { // 右半区反转
n3 = n2.next; // n3 -> 保存下一节点
n2.next = n1; // 下一个反转节点
n1 = n2; // n1 移动
n2 = n3; // n2 移动
}
n3 = n1; // n3 -> 保存最后一个节点
n2 = head; // n2 -> 左边第一个节点
boolean res = true;
while (n1 != null && n2 != null) { //检查回文
if (!n1.value.equals(n2.value)) {
res = false;
break;
}
n1 = n1.next; // 从右到中部
n2 = n2.next; // 从左到中部
}
n1 = n3.next;
n3.next = null;
while (n1 != null) { // 恢复列表
n2 = n1.next;
n1.next = n3;
n3 = n1;
n1 = n2;
}
return res;
}
返回false