LeetCode--234. Palindrome Linked List(看单链表是否是回文)
方法1:使用栈将所有元素入栈,然后出栈一半的元素和链表前一半元素进行比较。时间O(n),空间O(n)
public boolean isPalindrome(ListNode head) { if(head ==null) return true; ListNode p = head; Stack<Integer> stack = new Stack(); while(p!=null){ stack.add(p.val); p=p.next; } int num = (stack.size()-1)/2; p = head; for(int i = 0 ; i <= num ; i++){ if(stack.pop()!=p.val) return false; p=p.next; } return true; }
方法2:将链表后半部分逆置,然后顺序比较前半部分和后半部分。时间O(n),空间O(1)
public static boolean isPalindrome(ListNode head) { if(head ==null) return true; ListNode p = head; int len = 0 ; while(p!=null){ len++; p=p.next; } int loc = (len-1)/2; p=head; while(loc !=0 ){ p=p.next; loc--; } ListNode h = new ListNode(0); //后半部分的头 ListNode q ; p=p.next; while(p!=null){ //先将后半部分逆置 q = p.next; p.next = h.next; h.next = p ; p=q; } h = h.next; p=head; while(h!=null){ if(h.val!=p.val) return false; h = h.next; p = p.next; } return true; }

浙公网安备 33010602011771号