题目
给定一个链表的头节点head,请判断该链表是否为回文结构。
要求时间复杂度为O(n),空间复杂度为O(1)
1 -> 2 ->1 返回true
将链表的右半部分反转,最后指向中间节点
如 1 -> 2 -> 3 -> 2 -> 1反转之后为
两边同时向中间移动,比较节点的值,如果一样返回true如果不同返回false
/**
* @program: Sword_to_Offer
* @author: GoKu
* @create: 2019-09-21 23:25
*/
public class 判断一个链表是否为回文结构 {
public static class Node{
public int value;
public Node next;
public Node(int data){
this.value = data;
}
}
public static boolean isPalindrome(Node head){
if(head == null || head.next == null) return true;
Node n1 = head;
Node n2 = head;
while( n2.next != null && n2.next.next != null){
n1 = n1.next;
n2 = n2.next.next;
}
n2 = n1.next;
n1.next = null;
Node n3 = null;
while(n2 != null){
n3 = n2.next;
n2.next = n1;
n1 = n2;
n2 = n3;
}
n3 = n1;
n2 = head;
boolean res = true;
while (n1 != null && n2 != null){
if(n1.value != n2.value){
res = false;
return res;
}
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;
}
public static void main(String[] args) {
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(2);
Node n5 = new Node(1);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
System.out.println(isPalindrome(n1));
while (n1 != null){
System.out.println(n1.value);
n1 = n1.next;
}
}
}