题目:

对于一个链表,请设计一个时间复杂度为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 }