题目:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
输入:1->2->2->1
返回:true
代码:(运行时间: 46 ms 占用内存:10952K)
1 import java.util.*; 2 3 /* 4 public class ListNode { 5 int val; 6 ListNode next = null; 7 8 ListNode(int val) { 9 this.val = val; 10 } 11 }*/ 12 public class PalindromeList { 13 public boolean chkPalindrome(ListNode A) { 14 Stack<Integer> stack = new Stack<>(); 15 boolean bool = false; 16 if (A.next == null) 17 return true; 18 while(A.next != null) 19 {//只要没有判断出来是回文结构,就一直进行判断,直到遍历完整个链表 20 if (bool == false) 21 { 22 stack.push(A.val); 23 if (A.val == A.next.val) 24 {//做一个备份进行判断是否为回文结构 25 bool = panduan(A,(Stack<Integer>) stack.clone()); 26 } 27 } 28 A = A.next; 29 } 30 return bool; 31 32 } 33 public boolean panduan(ListNode N ,Stack<Integer> stc) { 34 while(true) { 35 if (stc.isEmpty() && N.next == null) 36 return true; 37 else if (stc.isEmpty() || N.next == null) 38 { 39 return false; 40 } 41 else 42 {//只要从栈中出来的和数据和链表中对应的数据相等,就一直循环。 43 N = N.next; 44 if (stc.pop() != N.val) 45 return false; 46 } 47 } 48 } 49 }