請判斷一個鏈表是否為回文鏈表。
示例 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;} }
?