劍指offer 56-60

56.刪除鏈表中重復(fù)結(jié)點(diǎn)

在一個排序的鏈表中派殷,存在重復(fù)的結(jié)點(diǎn)偿凭,請刪除該鏈表中重復(fù)的結(jié)點(diǎn)睁壁,重復(fù)的結(jié)點(diǎn)不保留氏身,返回鏈表頭指針寒屯。 
例如荐捻,鏈表1->2->3->3->4->4->5 處理后為 1->2->5

這個題最開始的時候本人用的是三指針的方法,pre保留前一個位置寡夹,cur表示當(dāng)前位置处面,next表示下一個位置,當(dāng)cur.val==next.val時開始循環(huán)找到第一個不重復(fù)的點(diǎn)菩掏,然后將cur移動到這個位置魂角,實際寫起來又臭又長且由于三指針的存在對一些特殊情況很容易搞錯或遺漏,看到了newcode大神在github上的代碼智绸,恍然大悟野揪,對這種題用遞歸看起來更簡單,更加容易理解瞧栗,代碼也更簡潔斯稳;
思路如下

方法為public ListNode deleteDuplication(ListNode pHead){}
輸入為一個結(jié)點(diǎn),返回的是以這個結(jié)點(diǎn)為頭結(jié)點(diǎn)的鏈表經(jīng)過刪除重復(fù)結(jié)點(diǎn)這個操作之后得到的鏈表的頭結(jié)點(diǎn)迹恐;
OK我們搞懂了這個函數(shù)干了件啥事兒挣惰,我們就可以直接把這個函數(shù)的返回值拿來用,即deleteDuplication(node)返回的是以node為頭結(jié)點(diǎn)的鏈表經(jīng)過刪除重復(fù)結(jié)點(diǎn)這一操作之后得到的頭結(jié)點(diǎn)殴边,我們先理解這一點(diǎn)憎茂,在抽象角度理解它,對遞歸大有裨益锤岸!然后再去實際的竖幔,方法體中的具體操作;
1.首先當(dāng)然還是判斷輸入是否為空是偷,或者輸入是否是單結(jié)點(diǎn)赏枚,對于這兩種情況我們都直接返回它本身即可亡驰;
2.由于我們要考察重復(fù)結(jié)點(diǎn),所以我們需要一個指針指向的是pHead的下一個結(jié)點(diǎn)饿幅;
3.下一步凡辱,主函數(shù)體來了,如果pHead.val==next.val栗恩,就一直循環(huán)找到第一個和pHead的值不相等的結(jié)點(diǎn)透乾,例如1->1->2->3,找到的第一個與1不相等的結(jié)點(diǎn)是2,由于1,1我們都要刪除的磕秤,next此時也在2這位置了乳乌,那么怎么樣,我們的問題是不是相當(dāng)于以2這個結(jié)點(diǎn)為頭結(jié)點(diǎn)重新做這個方法市咆?
即返回值應(yīng)該用deleteDuplication(next)來操作汉操,我們把這個操作記做操作1;
如果不相等呢蒙兰,OK磷瘤,那么證明這個pHead這個結(jié)點(diǎn)不是重復(fù)結(jié)點(diǎn),那么我們只需要確保它后面的結(jié)點(diǎn)是不含重復(fù)結(jié)點(diǎn)的鏈表即可搜变,上升到遞歸的宏觀角度來看采缚,我們怎么做pHead.next = deleteDuplication(pHead.next)即可,我們把這個操作記做操作2挠他;
其實在實際遞歸中這兩種遞歸方法都是交叉使用的扳抽,好就好在返回的是一個結(jié)點(diǎn),而pHead.next這一操作又可以將遞歸返回的各結(jié)點(diǎn)之間相連接起來殖侵;
弄幾個具有特點(diǎn)的例子來分析下
1,1,1,1,1,1,1,1這個例子一進(jìn)來就是pHead.val==next.val直接用操作一贸呢,返回的是deleteDuplication(null),即返回null,正好符合
1,2,3,3,4,4,5拢军,首先pHead.next = deleteDuplication(2)贮尉,然后相當(dāng)于對2這個結(jié)點(diǎn)進(jìn)行操作,然后2不重復(fù)朴沿,又2.next = deleteDuplication(3)猜谚,返回的是deleteDuplication(4),deleteDuplication(4)返回的又是deleteDuplication(5)赌渣,返回的即5本身魏铅,故1->2->5接上了,假設(shè)這個題最后一位是4而沒有5坚芜,也會遞歸到null,即1->2->null览芳,依然符合;

分析完了鸿竖,代碼如下

public ListNode deleteDuplication(ListNode pHead) {
    if (pHead == null || pHead.next == null)
        return pHead;
    ListNode next = pHead.next;
    if (pHead.val == next.val) {
        while (next != null && pHead.val == next.val)
            next = next.next;
        return deleteDuplication(next);
    } else {
        pHead.next = deleteDuplication(pHead.next);
        return pHead;
    }
}

57.二叉樹的下一個結(jié)點(diǎn)

給定一個二叉樹和其中的一個結(jié)點(diǎn)沧竟,請找出中序遍歷順序的下一個結(jié)點(diǎn)并且返回铸敏。
注意,樹中的結(jié)點(diǎn)不僅包含左右子結(jié)點(diǎn)悟泵,同時包含指向父結(jié)點(diǎn)的指針杈笔。

該題方仿照前面的二叉樹和鏈表的相互轉(zhuǎn)換即可

中序遍歷
1.左結(jié)點(diǎn)遞歸
2.do something
3.右結(jié)點(diǎn)遞歸

仿照這個順序,調(diào)整do something的位置即可得到前序和后序的方法
本題中需要注意根節(jié)點(diǎn)為給出糕非,需要用next指針來找到根節(jié)點(diǎn)
代碼如下

public class Solution {
    //初始化一個標(biāo)志位來表示是否找到了當(dāng)前結(jié)點(diǎn)
    private boolean flag = false;
    //用一個結(jié)點(diǎn)res來存儲返回的結(jié)果
    private TreeLinkNode res = null;
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        //由于存在指向父節(jié)點(diǎn)的next指針蒙具,所以我們先通過pNode找到根節(jié)點(diǎn)
        TreeLinkNode cur = pNode;
        while(cur.next!=null){
            cur = cur.next;
        }
        //找到根節(jié)點(diǎn)了之后,這個題的做法就跟之前的二叉樹轉(zhuǎn)化為雙向鏈表一模一樣
        mid_order(cur,pNode);
        return res;
    }
    
    private  void mid_order(TreeLinkNode node,TreeLinkNode pNode){
        //遞歸到葉子結(jié)點(diǎn)的時候返回
        if(node==null){
            return;
        }
        //中序遍歷遞歸從左結(jié)點(diǎn)開始
        mid_order(node.left,pNode);
        //如果flag已經(jīng)為true了朽肥,證明前一個結(jié)點(diǎn)已經(jīng)是給定結(jié)點(diǎn)了
        //此時只需把當(dāng)前結(jié)點(diǎn)賦給結(jié)點(diǎn)res即可禁筏,記得把flag再變?yōu)閒alse,不然會造成后面的錯誤
        if(flag){
            res = node;
            flag = false;
        }
        //找到給定結(jié)點(diǎn)了衡招,就把flag變?yōu)閠rue篱昔,然后接著遞歸找到下一個結(jié)點(diǎn)
        if(node == pNode){
            flag = true;
        }
        mid_order(node.right,pNode);
        
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市始腾,隨后出現(xiàn)的幾起案子州刽,更是在濱河造成了極大的恐慌,老刑警劉巖窘茁,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀伦,死亡現(xiàn)場離奇詭異脆烟,居然都是意外死亡山林,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門邢羔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驼抹,“玉大人,你說我怎么就攤上這事拜鹤】蚣剑” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵敏簿,是天一觀的道長明也。 經(jīng)常有香客問我,道長惯裕,這世上最難降的妖魔是什么温数? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蜻势,結(jié)果婚禮上撑刺,老公的妹妹穿的比我還像新娘。我一直安慰自己握玛,他們只是感情好够傍,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布甫菠。 她就那樣靜靜地躺著,像睡著了一般冕屯。 火紅的嫁衣襯著肌膚如雪寂诱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天愕撰,我揣著相機(jī)與錄音刹衫,去河邊找鬼。 笑死搞挣,一個胖子當(dāng)著我的面吹牛带迟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囱桨,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼仓犬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舍肠?” 一聲冷哼從身側(cè)響起搀继,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翠语,沒想到半個月后叽躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肌括,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年点骑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍夭。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡黑滴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出紧索,到底是詐尸還是另有隱情袁辈,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布珠漂,位于F島的核電站晚缩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏媳危。R本人自食惡果不足惜荞彼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望济舆。 院中可真熱鬧卿泽,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至第租,卻和暖如春措拇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慎宾。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工丐吓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趟据。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓券犁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親汹碱。 傳聞我的和親對象是個殘疾皇子粘衬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

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

  • 樹 記錄《劍指offer》中所有關(guān)于樹的題目,以及LeetCode中的相似題目咳促。 相關(guān)題目列表 題目 樹是一種最常...
    wenmingxing閱讀 1,421評論 2 13
  • 鏈表 記錄《劍指offer》中所有關(guān)于鏈表的題目稚新,以及LeetCode中的相似題目 相關(guān)題目列表 題目 鏈表是面試...
    wenmingxing閱讀 1,172評論 0 11
  • 總結(jié) 想清楚再編碼 分析方法:舉例子、畫圖 第1節(jié):畫圖分析方法 對于二叉樹跪腹、二維數(shù)組褂删、鏈表等問題,都可以采用畫圖...
    M_巴拉巴拉閱讀 1,211評論 0 7
  • 動態(tài)規(guī)劃 111. 爬樓梯思路類似斐波那契數(shù)列注意考慮第 0 階的特殊情況 272. 爬樓梯 II思路類似上題冲茸,只...
    6默默Welsh閱讀 2,435評論 0 1
  • 以此文記錄學(xué)習(xí) 數(shù)據(jù)結(jié)構(gòu)-樹 的相關(guān)知識屯阀,以備后續(xù)回顧復(fù)習(xí)。 一噪裕、樹 定義: 樹(Tree)是n(n>=0)個結(jié)點(diǎn)...
    逐日追星看月亮閱讀 541評論 0 0