帶return的遞歸構(gòu)建

用個(gè)題目具舉例子:

一條非遞減的鏈表购城,請(qǐng)刪除鏈表中帶重復(fù)值的節(jié)點(diǎn)羹唠,只保留刪減前不重復(fù)的節(jié)點(diǎn)惫皱,返回頭結(jié)點(diǎn)叙量。

[1 - 2 - 2 - 3] => [1 - 3]

思路:
遞歸實(shí)質(zhì)就是: 向下遍歷产镐,然后向上回溯隘庄。核心是:[只看當(dāng)前層]。帶返回值的遞歸癣亚,返回值有兩種可能:

  1. 返回的是第一步的返回結(jié)果丑掺;(例1分析)
  2. 返回的是最后一步回溯的結(jié)果。
  • 這里舉例說(shuō)明逃糟,看代碼:
public int testI(int i, boolean flag) {
    if(i >= 5) return i;
    System.out.print(i);
    if (flag) {
        return testI(++i, true);
    } else {
        testI(++i, false);
        return i;
    }
}
  • 當(dāng)調(diào)用函數(shù)的flag為false吼鱼,代碼簡(jiǎn)化成
public int testI(int i, boolean flag) {
    if(i >= 5) return i;
    System.out.print(i);
    testI(++i, false);
    return i;
}
// 012341 

此時(shí)對(duì)應(yīng)第一步情況,因?yàn)樽詈笫莚eturn一個(gè)顯式的值绰咽,那么向下遞歸后菇肃,得到了結(jié)果只被上一層遞歸得到,最終返回的結(jié)果就是第一層取募。

  • 當(dāng)調(diào)用函數(shù)的flag為true琐谤,代碼簡(jiǎn)化成
public int testI(int i, boolean flag) {
    if(i >= 5) return i;
    System.out.print(i);
    return testI(++i, true);
}
// 012345

對(duì)應(yīng)最后一步情況,每次返回的是testI函數(shù)本身的值玩敏,最終層的結(jié)果斗忌,被回溯上去质礼,得到的結(jié)果是最終層。
那么這兩種情況如何判斷呢织阳?
看最終return與下一層有沒(méi)有關(guān)系眶蕉。

  • 第一種,只是用到了下層唧躲,但下層和返回結(jié)果沒(méi)有直接關(guān)系(即返回的值或引用沒(méi)有與下級(jí)產(chǎn)生直接關(guān)系)造挽,則為第一種情況。
  • 若有關(guān)系(最常見(jiàn)的就是return 遞歸函數(shù)return testI())弄痹,那么返回值就是終結(jié)遞歸的那一條語(yǔ)句(if(i >= 5) return i)饭入。
現(xiàn)在再來(lái)看這個(gè)題目

因?yàn)橐祷劓湵眍^結(jié)點(diǎn)head肛真,顯然是第一種(返回第一步)谐丢,最終返回的第一層就是真實(shí)頭結(jié)點(diǎn)。

那么每一層要做的事情就是:判斷當(dāng)前層有沒(méi)有相同的多個(gè)節(jié)點(diǎn)蚓让,

  • 若有:將當(dāng)前層所有相同節(jié)點(diǎn)全部刪掉乾忱,并返回下一層回溯上來(lái)的結(jié)果(因?yàn)閺?fù)數(shù)個(gè)節(jié)點(diǎn)要全部刪掉)。
  • 若沒(méi)有:保留當(dāng)前節(jié)點(diǎn)并返回給上一層历极。
  1. 先構(gòu)建返回條件
if (head == null || head.next == null) return head;
  1. 對(duì)當(dāng)前節(jié)點(diǎn)和下一節(jié)點(diǎn)進(jìn)行值的判斷饭耳,若相等,則刪除該節(jié)點(diǎn)执解,并查看下一個(gè)節(jié)點(diǎn),直到值不相等纲酗。
if (head.val == head.next.val) {
    while (head.next != null && head.val == head.next.val) {
        head = head.next; // 迭代找到下一層的節(jié)點(diǎn)
}
// 返回下一層回溯上來(lái)的節(jié)點(diǎn)
return deleteDuplicates1(head.next);
}
  1. 若不相等衰腌,需要保留當(dāng)前節(jié)點(diǎn),并將下一層的節(jié)點(diǎn)接在后面觅赊。返回的是當(dāng)前節(jié)點(diǎn)右蕊。
else {
// 接下一層的節(jié)點(diǎn)
    head.next = deleteDuplicates(head.next);
    return head;
}
  1. 若想要?jiǎng)h除重復(fù)節(jié)點(diǎn),但只是刪除到只剩一個(gè)吮螺。怎么辦呢饶囚?顯然從第二步的返回值下手,不能直接返回回溯上來(lái)的節(jié)點(diǎn)鸠补,而要拼接一下萝风。
head.next = deleteDuplicates1(head.next);
return head;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市紫岩,隨后出現(xiàn)的幾起案子规惰,更是在濱河造成了極大的恐慌,老刑警劉巖泉蝌,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歇万,死亡現(xiàn)場(chǎng)離奇詭異揩晴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贪磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門硫兰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寒锚,你說(shuō)我怎么就攤上這事劫映。” “怎么了壕曼?”我有些...
    開(kāi)封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵苏研,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我腮郊,道長(zhǎng)摹蘑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任轧飞,我火速辦了婚禮衅鹿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘过咬。我一直安慰自己大渤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布掸绞。 她就那樣靜靜地躺著泵三,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衔掸。 梳的紋絲不亂的頭發(fā)上烫幕,一...
    開(kāi)封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音敞映,去河邊找鬼较曼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛振愿,可吹牛的內(nèi)容都是我干的捷犹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冕末,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萍歉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起档桃,我...
    開(kāi)封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翠桦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體销凑,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丛晌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斗幼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澎蛛。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜕窿,靈堂內(nèi)的尸體忽然破棺而出谋逻,到底是詐尸還是另有隱情,我是刑警寧澤桐经,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布毁兆,位于F島的核電站,受9級(jí)特大地震影響阴挣,放射性物質(zhì)發(fā)生泄漏气堕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一畔咧、第九天 我趴在偏房一處隱蔽的房頂上張望茎芭。 院中可真熱鬧,春花似錦誓沸、人聲如沸梅桩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宿百。三九已至,卻和暖如春洪添,著一層夾襖步出監(jiān)牢的瞬間犀呼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工薇组, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坐儿。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓律胀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親貌矿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炭菌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 鏈表的算法,遞歸是一個(gè)很常見(jiàn)的結(jié)題思路逛漫,但很容易陷入套娃中黑低,特別是帶返回值的遞歸,有時(shí)候就很懵,不知道到底返回了什...
    心之若涯閱讀 2,670評(píng)論 0 1
  • 前言 React Fiber 不是一個(gè)新的東西克握,但在前端領(lǐng)域是第一次廣為認(rèn)知的應(yīng)用蕾管。幾年前全新的Fiber架構(gòu)讓剛...
    這個(gè)前端不太冷閱讀 5,509評(píng)論 2 8
  • 標(biāo)準(zhǔn)迭代范式 [回溯算法] 五大常用算法之回溯法 本文轉(zhuǎn)自2018年02月12日 算法入門6:回溯法 一. 回溯法...
    高大寬333閱讀 3,088評(píng)論 0 0
  • 3-1.數(shù)組中重復(fù)的數(shù)字 思路分析:如果不考慮時(shí)間復(fù)雜度,則可以先對(duì)數(shù)組排序(需要 的時(shí)間)菩暗,然后再?gòu)闹姓抑貜?fù)的...
    oneoverzero閱讀 371評(píng)論 0 1
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者掰曾,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)停团,也就放棄了無(wú)數(shù)的可能旷坦。 ...
    yichen大刀閱讀 6,041評(píng)論 0 4