实现思路:借助两个快慢指针来实现,快指针走两步,慢指针走一步,当快指针到终点时,慢指针刚好到中点,并且在慢指针每走一步中,将其指向方向修改,最后对比前后即可判断是否为回文字符串。
public class Palindrome { static class ListNode{ int var; ListNode next; public ListNode(int x) { this.var = x; } } public static boolean isPalindrome(ListNode head){ if(head ==null || head.next==null){ return true; } //先找到链表的中间节点,使用两个快慢指针:快指针移动两步,慢指针移动一步 ListNode pre = null; ListNode fast = head; ListNode slow = head; while (fast !=null && fast.next !=null) { fast = fast.next.next; ListNode next = slow.next; slow.next = pre; pre = slow; slow = next; } if(fast !=null){ fast = fast.next; } //这时得到的pre和slow都是在中点 while (slow !=null) { if(slow.var != pre.var){ return false; } slow = slow.next; pre = pre.next; } return true; } }
测试:
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String tmp=in.nextLine();
char[] s=tmp.toCharArray();
ListNode[] node=new ListNode[s.length];
for(int i=0;i<s.length;i++){
node[i]=new ListNode(s[i]);
}
for(int i=0;i<s.length;i++){
if(i==s.length-1){ //最后一个节点,指针指向空
node[i].next=null;
}
else node[i].next=node[i+1];
}
boolean flag=Palindrome.isPalindrome(node[0]);
System.out.println("链表是回文吗? "+flag);
}