5. 用鏈表檢測(cè)回文

前年面摩根士丹利的時(shí)候被Joshua大哥問過的題铐拐。當(dāng)時(shí)墨跡半天我也只是說出來要把鏈表反轉(zhuǎn)一下再比較。(結(jié)果還是被要了练对。只能說人家讓過了遍蟋。其實(shí)當(dāng)時(shí)站在我的角度看,我已經(jīng)掛了螟凭。)

這次寫一個(gè)完整的做法:
先找到鏈表的中點(diǎn)虚青,用一快一慢兩個(gè)指針,快的一次走兩步螺男,慢的一次走一步棒厘∽荽快的到頭的時(shí)候,慢的正好在中間奢人。
然后從鏈表的中點(diǎn)開始谓媒,將后半段反轉(zhuǎn)。
然后用兩個(gè)指針何乎。一個(gè)指向原鏈表的起點(diǎn)句惯。另一個(gè)指向被反轉(zhuǎn)部分的起點(diǎn)。
兩個(gè)指針挨個(gè)遍歷支救。如果遇到不一樣的宗弯,就說明不是回文。

比如這樣:
原鏈表: 1 -> 2 -> 3 -> 4 -> 1
從中間反轉(zhuǎn)之后 1-> 4->3
從原鏈表和反轉(zhuǎn)之后的鏈表分別遍歷
1 == 1 繼續(xù)
4 != 2 說明不是回文搂妻。

提供的方法:
private class ListNode 自己定義的做鏈表的節(jié)點(diǎn)
private boolean isStringPalindrome(String input) 用來測(cè)試回文的方法
private ListNode reverseLinkedList(ListNode head)反轉(zhuǎn)一個(gè)鏈表
private ListNode getLinkedListFromString(String input)測(cè)試用。將輸入的字符串變成鏈表
private void printList(ListNode head)調(diào)試用辕棚。打印鏈表欲主。

public class TestPalindrome {

    private class ListNode {
        char val;
        ListNode next;
        ListNode(){}
        ListNode(char val) {
            this.val = val;
        }
    }

    public static void main(String[] args) {
        TestPalindrome tp = new TestPalindrome();

        System.out.println(tp.isStringPalindrome("abcba")); // true
        System.out.println(tp.isStringPalindrome("abccba")); // true
        System.out.println(tp.isStringPalindrome("12345")); // false
        System.out.println(tp.isStringPalindrome("12346")); // false
        System.out.println(tp.isStringPalindrome("1")); // true
        System.out.println(tp.isStringPalindrome("")); // true
        System.out.println(tp.isStringPalindrome(null)); // false
    }

    private boolean isStringPalindrome(String input) {
        if (input == null) {return false;}
        if (input.isEmpty()) {return true;}
        ListNode head = getLinkedListFromString(input);
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode reversedSecondHalf = reverseLinkedList(slow);
        ListNode beginPointer = head;
        ListNode endPointer = reversedSecondHalf;
        while(endPointer != null) {
            if (beginPointer.val == endPointer.val) {
                endPointer = endPointer.next;
                beginPointer = beginPointer.next;
                continue;
            }
            return false;
        }
        return true;

    }

    private ListNode reverseLinkedList(ListNode head) {
        ListNode prevNode;
        ListNode currNode;
        ListNode dummy = new ListNode();
        dummy.next = head;
        prevNode = dummy;
        currNode = head;
        while(currNode != null) {
            ListNode temp = currNode.next;
            currNode.next = prevNode;
            prevNode = currNode;
            currNode = temp;
        }
        dummy.next.next = null; // remove the
        return prevNode;
    }

    private ListNode getLinkedListFromString(String input) {
        ListNode dummy = new ListNode();
        ListNode prev = dummy;
        char[] chars = input.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            ListNode node = new ListNode(chars[i]);
            node.val = chars[i];
            prev.next = node;
            prev = prev.next;
        }
        return dummy.next;
    }

    private void printList(ListNode head) {
        ListNode pointer = head;
        while (pointer != null) {
            System.out.print(pointer.val + " ; ");
            pointer = pointer.next;
        }
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逝嚎,隨后出現(xiàn)的幾起案子扁瓢,更是在濱河造成了極大的恐慌,老刑警劉巖补君,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件引几,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挽铁,警方通過查閱死者的電腦和手機(jī)伟桅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叽掘,“玉大人楣铁,你說我怎么就攤上這事「猓” “怎么了盖腕?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浓镜。 經(jīng)常有香客問我溃列,道長,這世上最難降的妖魔是什么膛薛? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任听隐,我火速辦了婚禮,結(jié)果婚禮上相叁,老公的妹妹穿的比我還像新娘遵绰。我一直安慰自己辽幌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布椿访。 她就那樣靜靜地躺著乌企,像睡著了一般。 火紅的嫁衣襯著肌膚如雪成玫。 梳的紋絲不亂的頭發(fā)上加酵,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音哭当,去河邊找鬼猪腕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钦勘,可吹牛的內(nèi)容都是我干的陋葡。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼彻采,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腐缤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肛响,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤岭粤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后特笋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剃浇,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年猎物,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虎囚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霸奕,死狀恐怖溜宽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情质帅,我是刑警寧澤适揉,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站煤惩,受9級(jí)特大地震影響嫉嘀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魄揉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一剪侮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦瓣俯、人聲如沸杰标。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腔剂。三九已至,卻和暖如春驼仪,著一層夾襖步出監(jiān)牢的瞬間掸犬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來泰國打工绪爸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湾碎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓奠货,卻偏偏與公主長得像介褥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子递惋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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