Java判断链表是否为回文结构
- 回文结构序列是指顺读和反读都一样的序列
空间复杂度:O(1)
时间复杂度:O(n)
/**
* 判断链表是不是回文结构
* @param head 链表的头结点
* @return true 是, false 否
*/
public static boolean isHuiWen(Node head){
if (head == null || head.next == null){
return true;
}
//定义一个快节点和慢节点
Node slow = head;
Node fast = head;
//最终slow会停在链表中间,指向中间节点
while (fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
//反转链表后半部分的节点
Node revNode = reverse(slow);
//链表头和链表尾进行比较,同时向中间前进
while (revNode != null){
// System.out.println(revNode.Data);
if (revNode.Data != head.Data){
return false;
}
revNode = revNode.next;
head = head.next;
}
return true;
}
/**
* 反转链表
* @param head 链表的头结点
* @return 返回反转后链表的头结点
*/
public static Node reverse(Node head){
if (head == null || head.next == null){
return head;
}
Node newNode = reverse(head.next);
head.next.next = head;
head.next = null;
return newNode;
}