鏈表的回文

請(qǐng)編寫一個(gè)函數(shù),檢查鏈表是否為回文。
給定一個(gè)鏈表ListNode* pHead,請(qǐng)返回一個(gè)bool,代表鏈表是否為回文。

測(cè)試樣例:
{1,2,3,2,1} 返回:true
{1,2,3,2,3} 返回:false

思路:

  1. 遍歷兩遍鏈表,第一遍利用棧保存所有節(jié)點(diǎn),第二遍遍歷時(shí)依次彈出棧中元素進(jìn)行比較.時(shí)間復(fù)雜度是O(n),空間復(fù)雜度是O(n).
  2. 利用棧保存鏈表左半部分的節(jié)點(diǎn), 然后在遍歷鏈表右半部分時(shí)依次彈出棧中的元素去和后面的節(jié)點(diǎn)依次進(jìn)行比較. 該方法的時(shí)間復(fù)雜度是O(n),空間復(fù)雜度是O(n/2).
  3. 類似方法2,利用floyd判圈算法(快慢指針?lè)?找到中間節(jié)點(diǎn).然后反轉(zhuǎn)右邊的鏈表.然后兩條鏈表同時(shí)遍歷進(jìn)行比較.比較結(jié)束后再將右側(cè)的鏈表復(fù)原,連回左側(cè)的鏈表.

方法3代碼

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Palindrome {
    public boolean isPalindrome(ListNode pHead) {
        if(pHead==null||pHead.next==null)return true;
        
        ListNode slow=pHead,fast=pHead;
        while(fast.next!=null&&fast.next.next!=null){ //find mid node
            slow=slow.next;
            fast=fast.next.next;
        }
        
        fast=slow.next; // first node of right list
        slow.next=null; //important 
        ListNode rHead=reverseList(fast); //preserve reversed list's head node
        fast=rHead;     //first node of left list
        slow=pHead;     //first node of right list
        
        boolean isPalindrome=true;
        while(fast.next!=null){
            if(slow.val!=fast.val){
                isPalindrome=false;
                break;
            }
            slow=slow.next;
            fast=fast.next;               
        }
        
        slow.next=reverse(rHead);  //restore reversed list
        return isPalindrome;
    }
    
    /**
    reverse the whole list and return its head node.
    */
    private ListNode reverseList(ListNode head){
        ListNode pre=null,next=null;
        while(head!=null){
            next=head.next;
            head.next=pre;
            pre=head;
            head=next;           
        }
        return pre;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學(xué)在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,376評(píng)論 0 12
  • //leetcode中還有花樣鏈表題,這里幾個(gè)例子,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,657評(píng)論 0 6
  • 請(qǐng)編寫一個(gè)函數(shù),檢查鏈表是否為回文。 給定一個(gè)鏈表ListNode* pHead,請(qǐng)返回一個(gè)bool,代表鏈表是否...
    X_Y閱讀 280評(píng)論 0 0
  • 總結(jié) 想清楚再編碼 分析方法:舉例子、畫圖 第1節(jié):畫圖分析方法 對(duì)于二叉樹、二維數(shù)組、鏈表等問(wèn)題,都可以采用畫圖...
    M_巴拉巴拉閱讀 1,295評(píng)論 0 7
  • 轉(zhuǎn)載請(qǐng)注明出處:http://www.itdecent.cn/p/c65d9d753c31 在上一篇博客《數(shù)據(jù)結(jié)構(gòu)...
    Alent閱讀 3,599評(píng)論 4 74

友情鏈接更多精彩內(nèi)容