第二周 鏈表學(xué)習(xí)

上周出了進(jìn)行鏈表學(xué)習(xí)之外个绍,也進(jìn)行了整體時(shí)間的大致盤點(diǎn)勒葱,看了下時(shí)間≌厦常基本上的算法類型错森,在國慶之前都能刷一遍。
這周也是進(jìn)行的鏈表的算法練習(xí)篮洁,主要做了六道題

對以上的題目花了大概三個(gè)小時(shí)左右的時(shí)間寫完涩维,當(dāng)然期間看了題解,為了加深對題目的理解袁波,今天又對題目進(jìn)行復(fù)盤瓦阐,重新寫了一遍題目,花了大概兩個(gè)時(shí)間∨衽疲現(xiàn)在對題目有了一定的把握睡蟋,但是還是有誤差,得使用下周的時(shí)間再進(jìn)行復(fù)習(xí)了枷颊。
下面復(fù)盤題目:

第一題:刪除排序鏈表中的重復(fù)元素

package main

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }
    var pre = head
    var cur = head.Next
    for pre!= nil&&cur!=nil{
        if pre.Val == cur.Val{
            for ;cur!=nil&&cur.Val==pre.Val;cur=cur.Next{

            }
            pre.Next = cur
            continue
        }
        pre = pre.Next
        cur= cur.Next
    }
    return head
}

刪除鏈表中的重復(fù)節(jié)點(diǎn)戳杀,這題看著是簡單,但是在重寫的過程中夭苗,還是出現(xiàn)了卡殼信卡。題目的思路是使用雙指針,前后兩個(gè)指針题造,判斷值是否相等傍菇,值相等后指針繼續(xù)往后遍歷;值不相等前后兩個(gè)指針同時(shí)向后移動界赔《埃看著上面的指針移動是不是有點(diǎn)東西牵触。

第二題:刪除排序鏈表中的重復(fù)元素 II

這題和上面那題的區(qū)別在于只能保留原始節(jié)點(diǎn)中沒有重復(fù)的節(jié)點(diǎn)。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

// 輸入: 1->2->3->3->4->4->5
// 輸出: 1->2->5
func deleteDuplicates(head *ListNode) *ListNode {
    if head == nil{
        return nil
    }
    var (
        du = new(ListNode)
        ret = du
        cur = head.Next
        pre = head
    )
    // [1,2,3,3,4,4,5]
    du.Next = head
    for cur != nil&&pre!=nil{
        if pre.Val == cur.Val{
            for ;cur!=nil&&cur.Val==pre.Val;cur=cur.Next{

            }
            ret.Next = cur
            pre = cur
            if cur != nil{
                cur = cur.Next
            }
            continue
        }
        pre = pre.Next
        cur = cur.Next
        ret = ret.Next
    }
    return du.Next
}

思路:方法和之前的方法大致相同咐低,有點(diǎn)區(qū)別就是需要刪除全部重復(fù)的節(jié)點(diǎn)揽思,而不只是保留一個(gè)節(jié)點(diǎn),為了滿足這點(diǎn)渊鞋,我們需要一個(gè)亞節(jié)點(diǎn)绰更。在鏈表中遍歷的時(shí)候,還是使用雙指針锡宋;如果出現(xiàn)了相同的節(jié)點(diǎn)儡湾,則后指針向后遍歷,直到出現(xiàn)不相同的節(jié)點(diǎn),這時(shí)候?qū)喒?jié)點(diǎn)的Next進(jìn)行賦值,修改前后兩個(gè)指針毙籽;如果沒有出現(xiàn)相同的節(jié)點(diǎn),則三個(gè)指針同時(shí)向后移動尝丐。這是三指針的算法。

第三題:反轉(zhuǎn)鏈表

這道是簡單的題目衡奥,代碼很簡單爹袁,題目也很容易理解,但是還真有需要注意的點(diǎn)矮固。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil{
        return nil
    }
    var (
        pre *ListNode
        cur = head
    )
    for cur!=nil{
        var t = cur.Next
        cur.Next = pre
        pre = cur
        cur = t
    }
    return pre
}

思路:使用雙指針失息,這里的前指針首先是空的(最后返回的也是前指針),后指針則首先指向頭結(jié)點(diǎn)档址。

第四題:反轉(zhuǎn)鏈表 II

這道題的題意倒是不難理解盹兢,就是旋轉(zhuǎn)鏈表中指定位置,從m到n的位置守伸。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
// 輸入: 1->2->3->4->5->NULL, m = 2, n = 4
// 輸出: 1->4->3->2->5->NULL
func reverseBetween(head *ListNode, m int, n int) *ListNode {
    if head == nil{
        return head
    }
    var index = m
    var cur = head
    var bHead *ListNode
    for index!=1{
        bHead = cur
        cur = cur.Next
        index--
    }
    var len = n-m
    var startNode = cur
    var pre = cur
    var tailNode = cur
    cur = cur.Next
    for len!=0{
        tailNode = cur
        var t = cur.Next
        cur.Next = pre
        pre = cur
        cur = t
        len--

    }
    // 鏈接鏈表
    if bHead !=nil{
        bHead.Next = tailNode
    }else{
        head = tailNode
    }
    startNode.Next = cur
    return head

}

思路:題目中因?yàn)閷和n的訪問進(jìn)行了顯示判斷绎秒,所以不必?fù)?dān)心m,n造成的越界尼摹。我們知道鏈表中的一部分進(jìn)行旋轉(zhuǎn)的時(shí)候有四個(gè)部分需要記錄见芹,分別是旋轉(zhuǎn)開始的上界,下屆蠢涝;旋轉(zhuǎn)結(jié)束的上界和下界玄呛。這在題目中分別是bHead,statrtNode惠赫,tailNode和cur這四個(gè)指針。對在書寫的時(shí)候總覺得思路不清晰故黑,現(xiàn)在這么一看倒是好點(diǎn)了儿咱。

分隔鏈表

這道題是使在小于x的值在大于等于x值的左邊庭砍,這道題,我的做法是首先遍歷鏈表混埠,然后把鏈表按照x分成小于x和大于x的兩部分怠缸,之后拼接兩個(gè)鏈表。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

 //  head = 1->4->3->2->5->2, x = 3
func partition(head *ListNode, x int) *ListNode {
    if head == nil{
        return head
    }
    var (
        beforeHead = new(ListNode)
        before = beforeHead
        afterHead = new(ListNode)
        after = afterHead
    )
    var cur = head
    for cur!=nil{
        if cur.Val < x{
            before.Next = cur
            before = before.Next
        }else{
            after.Next = cur
            after = after.Next
        }
        cur = cur.Next
    }
    after.Next = nil
    before.Next = afterHead.Next
    return beforeHead.Next
}

第六題 重排鏈表

這道題我使用的方法還是鏈表拆分钳宪,首先遍歷鏈表揭北,獲取鏈表的長度,然后通過長度吏颖,把鏈表分成前后兩個(gè)部分搔体。對后一部分進(jìn)行倒置,然后進(jìn)行隔一的拼接半醉。

package main

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reorderList(head *ListNode) {
    if head == nil{
        return 
    }
    listLen := GetListLen(head)
    // 將鏈表變成兩段
    var len = 0
    var cur = head
    for len!=listLen/2{
        cur = cur.Next
        len++
    }
    var firList = head
    var secList = cur.Next
    cur.Next = nil
    // 重排第二個(gè)鏈表
    secList = rankList(secList)
    // 合并兩個(gè)鏈表 
    for firList != nil&&secList!=nil{
        var fir = firList.Next
        var sec = secList.Next
        firList.Next = secList
        secList.Next = fir
        firList = fir
        secList = sec
    }
    return
}
func GetListLen(head*ListNode)int{
    var ret int
    for head!=nil{
        ret ++
        head = head.Next
    }
    return ret
}
func rankList(head *ListNode)*ListNode{
    if head == nil{
        return head
    }
    var cur = head
    var pre *ListNode
    for cur!=nil{
        var t = cur.Next
        cur.Next = pre
        pre = cur
        cur = t
    }
    return pre
}

總結(jié):

確實(shí)疚俱,在總結(jié)之后,發(fā)現(xiàn)對題目的理解更加深刻了缩多,到這里呆奕,鏈表的復(fù)習(xí)就告一段落了。接下來按照計(jì)劃是二叉樹了衬吆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梁钾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逊抡,更是在濱河造成了極大的恐慌姆泻,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秦忿,死亡現(xiàn)場離奇詭異麦射,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灯谣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門潜秋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胎许,你說我怎么就攤上這事峻呛。” “怎么了辜窑?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵钩述,是天一觀的道長。 經(jīng)常有香客問我穆碎,道長牙勘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮方面,結(jié)果婚禮上放钦,老公的妹妹穿的比我還像新娘。我一直安慰自己恭金,他們只是感情好操禀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著横腿,像睡著了一般颓屑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耿焊,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天揪惦,我揣著相機(jī)與錄音,去河邊找鬼搀别。 笑死丹擎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歇父。 我是一名探鬼主播蒂培,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼榜苫!你這毒婦竟也來了护戳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤垂睬,失蹤者是張志新(化名)和其女友劉穎媳荒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驹饺,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钳枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赏壹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鱼炒。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝌借,靈堂內(nèi)的尸體忽然破棺而出昔瞧,到底是詐尸還是另有隱情,我是刑警寧澤菩佑,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布自晰,位于F島的核電站,受9級特大地震影響稍坯,放射性物質(zhì)發(fā)生泄漏酬荞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望混巧。 院中可真熱鬧糟把,春花似錦、人聲如沸牲剃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凿傅。三九已至,卻和暖如春数苫,著一層夾襖步出監(jiān)牢的瞬間聪舒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工虐急, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箱残,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓止吁,卻偏偏與公主長得像被辑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子敬惦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

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

  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會員)盼理,僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,738評論 2 36
  • Leetcode日記:19&24&84.鏈表相關(guān)操作 19.刪除倒數(shù)第N個(gè)元素 19-題目 Given a lin...
    WeiTanOri閱讀 202評論 0 0
  • 進(jìn)入了7月12號了俄删,本來預(yù)計(jì)計(jì)劃的7月份開始的第一周學(xué)習(xí)宏怔,結(jié)果到現(xiàn)在,整整推遲了12天的時(shí)間畴椰。還是得一直嚴(yán)于律己臊诊,...
    7贏月閱讀 120評論 0 0
  • Leetcode 19 Remove Nth Node From End of List 給定一個(gè)鏈表,刪除鏈表的...
    冰冰愛吃冰淇淋閱讀 218評論 0 0
  • 搞懂單鏈表常見面試題 Hello 繼上次的 搞懂基本排序算法斜脂,這個(gè)一星期抓艳,我總結(jié)了,我所學(xué)習(xí)和思考的單鏈表基礎(chǔ)知識...
    醒著的碼者閱讀 4,580評論 1 45