标签:
Given a singly linked list, determine if it is a palindrome.
该题是判断一个链表是不是回文链表。
思路一:将该链表反转,然后从头开始对比节点值,时间复杂度O(n),空间复杂度O(N)
思路二:利用runner pointer。很多的题目都可以利用这个方法来解决。Runner pointer和递归是解决链表问题最常用的两个方法。
定义两个指针,slow runner和fast runner,fast以2倍于slow的速度向链表尾部移动。如有奇数个节点:当fast到达链表尾部时,slow恰好到达链表中间。如有偶数个节点:fast第一次为null时,slow恰好完成了一半节点的访问。把slow访问过的节点元素值压入一个stack里。此后slow继续向链表尾部访问,同时stack里的元素开始出栈(奇数个元素的情况下要跳过中间元素),比较两个元素值,一旦出现不等,则不是回文,否则是。该解法的时间复杂度是O(N),因为需要一次迭代,同时需要O(N)的空间用作stack来存放链表元素。
下面是这两种方法的实现
思路一:
思路二:
public boolean isPalindrome(ListNode head) { if(head==null) return true; if(head!=null && head.next==null) return true; ListNode slow=head; ListNode fast=head; boolean skip=false; Stack<Integer> stack=new Stack<Integer>(); while(slow!=null) { if(fast==null)//偶数个 { skip=true; if(slow.val!=stack.pop()) return false; } if(fast!=null && fast.next==null)//奇数个 { if(!skip) slow=slow.next; skip=true; if(slow.val!=stack.pop()) return false; } if(!skip) stack.push(slow.val); slow=slow.next; if(fast!=null && fast.next!=null) { fast=fast.next.next; } } return true; }
标签:
原文地址:http://www.cnblogs.com/maydow/p/4637177.html