1. 程式人生 > >領釦——234.迴文連結串列

領釦——234.迴文連結串列

領釦——234.迴文連結串列

請判斷一個連結串列是否為迴文連結串列。

示例 1:

輸入: 1->2
輸出: false
示例 2:

輸入: 1->2->2->1
輸出: true
思路是翻轉後一部分的連結串列,然後用雙指標從每部分頭開始比較,一樣返回true,不一樣返回false

/**
 * 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;
        int length=0;
        //初始化指向頭結點
        ListNode tmp=head;
        while(tmp!=null){
            length++;
            tmp=tmp.next;
        }
        //算出連結串列中間的位置
        int halfLength=length/2;
        //把指標移到中間位置
        tmp=head;
        for(int i=0;i<halfLength;i++){
            tmp=tmp.next;
        }
        //開始反轉後一部分的連結串列
        ListNode pre=tmp;
        ListNode pNode=tmp.next;
        ListNode next=null;
        while(pNode!=null){
            next=pNode.next;
            pNode.next=pre;
            pre=pNode;
            pNode=next;
        }
        //比較兩部分連結串列的每個值是不是一樣
        for(int i=0;i<halfLength;i++){
            if(head.val!=pre.val)
                return false;
            head=head.next;
            pre=pre.next;
        }
        return true;
    }
}