單鏈表

單鏈表由一個(gè)個(gè)節(jié)點(diǎn)(Node)組成儡率,引用LeetCode里對(duì)單鏈表節(jié)點(diǎn)的表示:
<pre>
/**

  • Definition for singly-linked list.
  • class ListNode {
  • int val;
  • ListNode next;
  • ListNode(int x) {
  •    val = x;
    
  •    next = null;
    
  • }
  • }
    */
    </pre>

每個(gè)節(jié)點(diǎn)里包含儲(chǔ)存的內(nèi)容及下一個(gè)節(jié)點(diǎn)的引用身弊,這樣熄捍,獲得一個(gè)頭結(jié)點(diǎn)(head),就可以對(duì)其他任意節(jié)點(diǎn)進(jìn)行操作廓潜。



以下是一些單鏈表經(jīng)典題抵皱,LeetCode上都有。

1.判斷是否有環(huán)

可以用哈希表(HashSet)通過(guò)判重的方式解決辩蛋,也可以用一快一慢兩個(gè)指針來(lái)解決呻畸,這樣空間復(fù)雜度只有O(1)。具體思想是悼院,快指針每次移動(dòng)2伤为,慢指針每次移動(dòng)1,如果有環(huán)据途,那么快指針在某個(gè)時(shí)刻會(huì)追趕上慢指針钮呀。注意初始化時(shí)要讓快指針先移一格,否則最開(kāi)始快慢指針就會(huì)重合昨凡。
<pre>
public boolean hasCycle(ListNode head) {

    if(head == null) return false;
    
    ListNode fast = head;
    ListNode slow = head;
    
    while(fast != null && fast.next != null){
        slow = slow.next;
        fast = fast.next.next;
        if(fast == slow) return true;
    }
    
    return false;
      
}</pre>

那么環(huán)從哪里開(kāi)始呢?假設(shè)慢指針從頭結(jié)點(diǎn)到環(huán)起始處需要走A步蚁署,再走B步與快指針相遇便脊。此時(shí)快指針走了2A+2B比慢指針多走一圈N,2A + 2B = N + A + B光戈。
由此得出 N = A + B哪痰。
慢指針已經(jīng)走了一圈中的B遂赠,再走A步又回到環(huán)起始處,而A正是從頭結(jié)點(diǎn)到環(huán)起始處的步數(shù)晌杰,用另一個(gè)指針從頭結(jié)點(diǎn)開(kāi)始與慢指針同步走跷睦,相遇處即為環(huán)起始處。
<pre>

public ListNode detectCycle(ListNode head) {
    
    if(head == null) return null;
    
    ListNode slow = head;
    ListNode fast = head;
    
    while(fast != null && fast.next != null){
        slow = slow.next;
        fast = fast.next.next;
        
        if(slow == fast){
            ListNode start = head;
            while(start != slow){
                start = start.next;
                slow = slow.next;
            }
            return start;
        }
    }
    
    return null;
    
}

</pre>

</br>

2.反轉(zhuǎn)鏈表

設(shè)置前后兩個(gè)指針肋演,每次讓后指針的next指向前指針抑诸,然后兩個(gè)指針都往后挪一位。注意前指針應(yīng)初始化為null爹殊,應(yīng)設(shè)置一個(gè)臨時(shí)變量?jī)?chǔ)存后指針的后一位以支持挪動(dòng)蜕乡。
<pre>
public ListNode reverseList(ListNode head) {

    ListNode pre = null;
    ListNode curr = head;
     
    while(curr != null){
        ListNode next = curr.next;
        curr.next = pre;
        pre = curr;
        curr = next;
    }
    
    return pre;
}

</pre>

</br>

3.合并兩個(gè)有序單鏈表

實(shí)現(xiàn)思想就是用small,big兩個(gè)指針來(lái)分別指向兩個(gè)鏈表中當(dāng)前節(jié)點(diǎn)值較小和較大的梗夸,如果small的下一個(gè)節(jié)點(diǎn)比big大了层玲,就把small的next指向big,然后big指向原先的small鏈表元素反症。
<pre>
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

    if(l1 == null) return l2;
    if(l2 == null) return l1;
    
    ListNode small = null;
    ListNode big = null;
    
    if(l1.val > l2.val){
        small = l2;
        big = l1;
    }else{
        small = l1;
        big = l2;
    }
    
    ListNode head = small;
    
    while(small.next != null && big != null){
        if(small.next.val > big.val){
            ListNode temp = small.next;
            small.next = big;
            small = big;
            big = temp;
        }else{
            small = small.next;
        }
        
    }
    
    small.next = big;
    
    return head;        
    
}

</pre>
看了下LeetCode其他人答案發(fā)現(xiàn)還可以遞歸解決辛块,于是順手也寫(xiě)了個(gè),確實(shí)簡(jiǎn)潔不少铅碍。
<pre>
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) return l2;
if(l2 == null) return l1;

    ListNode head = null;
    
    if(l1.val < l2.val){
        head = l1;
        head.next = mergeTwoLists(l1.next,l2);
    }else{
        head = l2;
        head.next = mergeTwoLists(l1,l2.next);
    }
    
    return head;   
}

</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末润绵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子该酗,更是在濱河造成了極大的恐慌授药,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呜魄,死亡現(xiàn)場(chǎng)離奇詭異悔叽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)爵嗅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)娇澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人睹晒,你說(shuō)我怎么就攤上這事趟庄。” “怎么了伪很?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵戚啥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锉试,道長(zhǎng)猫十,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮拖云,結(jié)果婚禮上贷笛,老公的妹妹穿的比我還像新娘。我一直安慰自己宙项,他們只是感情好乏苦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著尤筐,像睡著了一般汇荐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叔磷,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天拢驾,我揣著相機(jī)與錄音,去河邊找鬼改基。 笑死繁疤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秕狰。 我是一名探鬼主播稠腊,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸣哀!你這毒婦竟也來(lái)了架忌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤我衬,失蹤者是張志新(化名)和其女友劉穎叹放,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挠羔,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井仰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了破加。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俱恶。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖范舀,靈堂內(nèi)的尸體忽然破棺而出合是,到底是詐尸還是另有隱情,我是刑警寧澤锭环,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布聪全,位于F島的核電站,受9級(jí)特大地震影響辅辩,放射性物質(zhì)發(fā)生泄漏荔烧。R本人自食惡果不足惜吱七,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹤竭。 院中可真熱鬧,春花似錦景醇、人聲如沸臀稚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吧寺。三九已至,卻和暖如春散劫,著一層夾襖步出監(jiān)牢的瞬間稚机,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工获搏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赖条,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓常熙,卻偏偏與公主長(zhǎng)得像纬乍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裸卫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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