问题描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂
度为O(1)的算法,判断其是否为回文结构。给定一个链表的头
指针A,请返回一个bool值,代表其是否为回文结构。保证链
表长度小于等于900。
测试样例:
1->2->2->1
返回:true
问题解析
找到中间节点,然后把后半个链表反转后与前半部分比较,
若有不相等则返回false,否则返回true;
代码
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
ListNode fast=A;
ListNode slow=A;
//找出中间节点
while( fast.next!=null &&fast.next.next!=null){
fast=fast.next.next;
slow=slow.next;
}
if(fast.next==null){
slow=slow.next;
}
//找中间节点在这里结束
ListNode reverse1=reverse(slow);//调用反转函数,反转后半个链表
//开始比较,判断是否为回文串
while (reverse1!=null&&A!=null){
if (A.val!=reverse1.val){
return false;
}else{
A=A.next;
reverse1=reverse1.next;
}
}
return true;
}
//自己写反转函数
public ListNode reverse(ListNode A){
if(A==null){
return null;
}
ListNode cur=A;
ListNode prev=null;
ListNode newHead=null;
while(cur!=null){
ListNode curNext=cur.next;
if (curNext==null){
newHead=cur;
}
cur.next=prev;
prev=cur;
cur=curNext;
}
return newHead;
}
}
若对找中间节点不太清楚可以参考如下:
找中间节点