234.回文鏈表

題目

請(qǐng)判斷一個(gè)鏈表是否為回文鏈表。

程序核心思想

  • 棧結(jié)構(gòu) 時(shí)間O(n) 空間O(n)
    把鏈表所有的節(jié)點(diǎn)入棧睦袖,然后遍歷一個(gè)珊肃,出棧一個(gè),如果值都能對(duì)上馅笙,那么是回文鏈表伦乔。
  • 棧結(jié)構(gòu) 時(shí)間O(n) 空間O(n/2)
    先遍歷一遍得到節(jié)點(diǎn)總數(shù),然后入棧一半的節(jié)點(diǎn)董习,然后遍歷剩下的節(jié)點(diǎn)烈和,同時(shí)出棧,如果值能對(duì)上皿淋,那么是回文鏈表招刹。
    先遍歷得到節(jié)點(diǎn)總數(shù)這一步也可以優(yōu)化恬试,可以通過快慢指針,慢指針走一步疯暑,快指針走兩步训柴,由此得到鏈表的中部位置。
  • 不用棧 時(shí)間O(n) 空間O(1)
    先用快慢指針妇拯,快指針走兩步幻馁,慢指針走一步,當(dāng)快指針走完時(shí)越锈,慢指針來到中點(diǎn)仗嗦。然后把后半段逆序,然后通過兩個(gè)指針甘凭,一個(gè)從頭一個(gè)從尾開始遍歷稀拐,直到中點(diǎn),如果全部相同則true对蒲,否則是false钩蚊,最后再把逆序的后半段還原回去。

下面的三個(gè)代碼分別代表了第二和第三種方法蹈矮,第二種方法寫了原始版和快慢指針優(yōu)化版砰逻,第三種方法沒有還原回去,還原的方法很簡(jiǎn)單泛鸟,題目這部分不檢測(cè)蝠咆,我就沒寫。

Tips

快指針能走兩步嗎北滥?fast.next != null && fast.next.next != null
用這句話來保證刚操。

代碼

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
import java.util.Stack;

class Solution {
    public boolean isPalindrome(ListNode head) {
        Stack<Integer> stack = new Stack<Integer>();
        ListNode a = head;
        int count = 0;
        
        while(a != null){
            a = a.next;
            count++;
        }
        
        a = head;
        for(int i = 0; i < count / 2; i++){
            stack.push(a.val);
            a = a.next;
        }
        
        if(count % 2 != 0){
            a = a.next;
        }
        
        while(!stack.empty()){
            if(a.val != stack.pop()){
                return false;
            }
            a = a.next;
        }
        return true;
    }
}
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
import java.util.Stack;

class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null)    return true;
        Stack<Integer> stack = new Stack<Integer>();
        ListNode slow = head;
        ListNode fast = head;
        
        while(fast.next != null  && fast.next.next != null){
            stack.push(slow.val);
            slow = slow.next;
            fast = fast.next.next;
        }
        if(fast.next != null){
            stack.push(slow.val);
        }
        slow = slow.next;
        
        
        while(slow != null){
            if(slow.val != stack.pop()){
                return false;
            }
            slow = slow.next;
        }
        return true;
    }
}
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
import java.util.Stack;

class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null)    return true;
        ListNode slow = head;
        ListNode fast = head;
        while(fast.next != null  && fast.next.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        
        ListNode b = slow;
        ListNode c = slow;
        if(slow.next != null){
            b = slow.next;
        }else{
            return true;
        }
        if(b.next != null){
            c = b.next;
        }else{
            if(head.val == b.val)   return true;
            return false;
        }
        
        slow.next = null;
        while(c != null){
            b.next = slow;
            slow = b;
            b = c;
            c = c.next;
        }
        b.next = slow;
        
        while(b != null && head != null){
            if(b.val != head.val)   return false;
            b = b.next;
            head = head.next;
        }
        
        return true;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市再芋,隨后出現(xiàn)的幾起案子菊霜,更是在濱河造成了極大的恐慌,老刑警劉巖济赎,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鉴逞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡司训,警方通過查閱死者的電腦和手機(jī)构捡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壳猜,“玉大人勾徽,你說我怎么就攤上這事⊥嘲猓” “怎么了喘帚?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵畅姊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吹由,道長(zhǎng)涡匀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任溉知,我火速辦了婚禮,結(jié)果婚禮上腕够,老公的妹妹穿的比我還像新娘级乍。我一直安慰自己,他們只是感情好帚湘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布玫荣。 她就那樣靜靜地躺著,像睡著了一般大诸。 火紅的嫁衣襯著肌膚如雪捅厂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天资柔,我揣著相機(jī)與錄音焙贷,去河邊找鬼。 笑死贿堰,一個(gè)胖子當(dāng)著我的面吹牛辙芍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羹与,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼故硅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了纵搁?” 一聲冷哼從身側(cè)響起吃衅,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腾誉,沒想到半個(gè)月后徘层,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妄辩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年惑灵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眼耀。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡英支,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哮伟,到底是詐尸還是另有隱情干花,我是刑警寧澤妄帘,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站池凄,受9級(jí)特大地震影響抡驼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肿仑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一致盟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尤慰,春花似錦馏锡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至责蝠,卻和暖如春党巾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霜医。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工齿拂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肴敛。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓创肥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親值朋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叹侄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 題目 難度:★★☆☆☆類型:鏈表 請(qǐng)判斷一個(gè)鏈表是否為回文鏈表。 進(jìn)階:你能否用 O(n) 時(shí)間復(fù)雜度和 O(1)...
    玖月晴閱讀 1,050評(píng)論 0 0
  • 請(qǐng)判斷一個(gè)鏈表是否為回文鏈表昨登。 示例 1: 輸入: 1->2輸出: false 示例 2: 輸入: 1->2->2...
    追云的帆閱讀 155評(píng)論 0 0
  • 234. 回文鏈表 請(qǐng)判斷一個(gè)鏈表是否為回文鏈表趾代。 示例 1: 輸入: 1->2輸出: false 示例 2: 輸...
    TheKey_閱讀 151評(píng)論 0 0
  • 請(qǐng)判斷一個(gè)鏈表是否為回文鏈表。 示例 1:輸入:1->2 輸入:1->2->2->1 輸出:false 輸出:tr...
    不胖二十斤不改名zz閱讀 175評(píng)論 0 0
  • 題目描述 請(qǐng)判斷一個(gè)鏈表是否為回文鏈表丰辣。 示例 1: 輸入: 1->2 輸出: false 示例 2: 輸入: 1...
    zhipingChen閱讀 180評(píng)論 0 2