链接:链表的回文结构
思路:如果是竞赛,把链表题直接转为数组做即可,方便快捷。作为面试题,有了面试官的限制就不行了。由于这是一个单向链表,没办法遍历到最后一个点在再从后往前遍历,所以我们必须先遍历到中间节点,然后把从中间节点到最后一个节点之间的链表翻转过来
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {
public boolean chkPalindrome(ListNode head) {
//找中间节点
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
//翻转后半段链表
ListNode pre = slow;
slow = slow.next;
pre.next = null;
while(slow != null){
ListNode tmp = slow.next;
slow.next = pre;
pre = slow;
slow = tmp;
}
//比较是否相等
while(head != null && pre != null){
if(head.val != pre.val)return false;
head = head.next;
pre = pre.next;
}
return true;
}
}