leetcode-回文链表
请判断一个链表是否为回文链表。
示例 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; } }