请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路:先遍历链表,获得长度。 把前半部分的链表逆置(leetcode-反转链表),与后半部分的链表进行比较。注意链表长度的奇偶。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public boolean isPalindrome(ListNode head) {if(head==null||head.next==null)return true;ListNode l=head;ListNode newH=null;ListNode node=head;ListNode temp=head;//得到链表的长度int len=0;while(l!=null){len++;l=l.next;}//倒置链表,在倒置过程中,newH是最后一个节点,也是倒置后链表的初始节点。temp则指向空,而该题中temp指向总链表一半的下个节点for(int i=0;i<len/2;i++){temp=node.next;node.next=newH;newH=node;node=temp;}//如果是奇数则需要让后链表前进一格if(len%2==1){temp=temp.next;}while(newH!=null&&temp!=null){if(newH.val!=temp.val)return false;newH=newH.next;temp=temp.next;}return true;} }