234. Palindrome Linked List

来源:互联网 发布:2015十大网络用语 编辑:程序博客网 时间:2024/06/14 00:03

Given a singly linked list, determine if it is a palindrome.

Follow up:

Could you do it in O(n) time and O(1) space?



回文链表,思路是把链表前后一分为二,切两半,注意元素个数为基数和偶数的情况要分开讨论。

把后面的那一半链表反转,然后和前面一半一起每走一步检查链表元素是否相同。

1->2->3->2->1

链表1 : 1->2

链表2: reverse(2->1)= 1->2

1->2->3->3->2->1

链表1 : 1->2->3

链表2: reverse(3->2->1)= 1->2->3


这里找切分点用的是遍历计数节点然后/2,也可以借鉴快慢指针的思想来找切分点。


 public boolean isPalindrome(ListNode head){if(head==null||head.next==null)return true;int cnt=1;ListNode node=head;while(node.next!=null){cnt++;node=node.next;}node=head;for(int i=0;i<(cnt%2==0?cnt/2:cnt/2+1);i++)node=node.next;node=reverseList(node);ListNode n=head;while(node!=null){if(n.val!=node.val)return false;node=node.next;n=n.next;}return true;}public ListNode reverseList(ListNode head){if(head==null)return head;ListNode prev=head;ListNode p=head.next;ListNode pnext=null;while(p!=null){pnext=p.next;p.next=prev;prev=p;p=pnext;}head.next=null;return prev;}


0 0