题目描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
大体思路:
通过快慢指针法得到mid(慢的依次存入栈),对奇偶情况进行处理
然后依次出栈和链表后一半元素比较
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class PalindromeList {
public static Stack<Integer> stack = new Stack<Integer>();
public static boolean chkPalindrome(ListNode A) {
// write code here
ListNode quick = A;
ListNode slow = A;
//快慢指针 得到mid
while (quick != null && quick.next != null) {
stack.push(slow.val);
quick = quick.next.next;
slow = slow.next;
}
if (quick == null) { //偶数,正好得到一半后的第一个
} else { //quick.next == null 基数,得到中间的那个
stack.pop();
slow = slow.next;
}
while (slow != null) {
if ((slow.val) != stack.pop()) {
return false;
}
slow = slow.next;
}
return true;
}
public static void main(String[] args) {
ListNode A = new ListNode(1);
ListNode B = new ListNode(2);
ListNode C = new ListNode(2);
ListNode D = new ListNode(1);
A.next = B;
B.next = C;
C.next = D;
System.out.println(chkPalindrome(A));
}
}