假设以带头结点的循环链表表示队列_[leetcode链表系列]2 删除链表中的节点
復(fù)習(xí)鏈表的插入
????鏈表的一個(gè)節(jié)點(diǎn)是由數(shù)據(jù)域和指針域構(gòu)成,指針域的地址值為下個(gè)元素的地址。那么我們需要插入或者刪除一個(gè)元素怎么處理呢?
先查看原始鏈表結(jié)構(gòu),準(zhǔn)備將結(jié)點(diǎn)x插入鏈表中。
此時(shí)我們需要先保存n節(jié)點(diǎn)的地址(300),n節(jié)點(diǎn)的地址存放在m節(jié)點(diǎn)的指針域,將此值賦值給x節(jié)點(diǎn)的指針域。(x->next=m->next),變成了下圖所示。
此時(shí)再將m節(jié)點(diǎn)和x節(jié)點(diǎn)連接起來。m->next=x.如下圖所示。
看到這里,有些小伙伴可能會(huì)有疑問了。如果是空鏈表,這樣的插入方式就行不通的了呀(自己可以畫圖看看哈),對,這就是要說的重點(diǎn)了,哨兵。
哨兵結(jié)點(diǎn)是什么?
我們可以先思考導(dǎo)致空鏈表不能使用第一種方案的原因,因?yàn)樗鼪]有結(jié)點(diǎn),我們自然無法獲取其地址,所以采用增加一個(gè)頭結(jié)點(diǎn),那么此時(shí)空鏈表的結(jié)構(gòu)如下圖4,非空鏈表結(jié)構(gòu)如下圖5.
復(fù)習(xí)鏈表的刪除
上面簡單介紹了帶頭結(jié)點(diǎn)的鏈表,在刪除處理的時(shí)候同樣適用,所以我們以后就直接采用帶頭結(jié)點(diǎn)的鏈表講解。下面直接看看刪除節(jié)點(diǎn)圖。
請編寫一個(gè)函數(shù),使其可以刪除某個(gè)鏈表中給定的(非末尾)節(jié)點(diǎn),你將只被給定要求被刪除的節(jié)點(diǎn)。
現(xiàn)有一個(gè)鏈表 -- head = [4,5,1,9],它可以表示為:
示例1:
輸入: head = [4,5,1,9], node = 5
輸出: [4,1,9]
解釋: 給定你鏈表中值為 5 的第二個(gè)節(jié)點(diǎn),那么在調(diào)用了你的函數(shù)之后,該鏈表應(yīng)變?yōu)?4 -> 1 -> 9.
說明:
鏈表至少包含兩個(gè)節(jié)點(diǎn)。
鏈表中所有節(jié)點(diǎn)的值都是唯一的。
給定的節(jié)點(diǎn)為非末尾節(jié)點(diǎn)并且一定是鏈表中的一個(gè)有效節(jié)點(diǎn)。
不要從你的函數(shù)中返回任何結(jié)果。
先思考一分鐘喲!
效果更好哈!
01題目解析常規(guī)套路
找到待刪除結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)的指針。
將指針指向待刪除的下一個(gè)結(jié)點(diǎn)。如下圖7所示。
仔細(xì)看題
發(fā)現(xiàn)沒,題目并沒有告訴我們其上一個(gè)結(jié)點(diǎn),不要緊,我們可以想辦法構(gòu)造出一個(gè)結(jié)點(diǎn),請看下。
目標(biāo)還是刪除5,最后結(jié)果為[4,1,9]。我們把需要?jiǎng)h除的5結(jié)點(diǎn)的后面節(jié)點(diǎn)1賦值給它,如下圖8.
嘿嘿,現(xiàn)在兩個(gè)結(jié)點(diǎn)值1,不管刪除哪一個(gè)我們都能獲得結(jié)果,但是第二個(gè)節(jié)點(diǎn)1我們不方便刪除,但是第三個(gè)結(jié)點(diǎn)1還是輕松的。假設(shè)為p指針指向刪除的節(jié)點(diǎn),那么直接就是p.next=p.next.next。如下圖9.
跟小藍(lán)每天進(jìn)步一點(diǎn)點(diǎn),生活就會(huì)美一點(diǎn)!
進(jìn)入算法,面試學(xué)習(xí)群,一起成長!
關(guān)注下方,回復(fù)"進(jìn)群"就進(jìn)入我們小分隊(duì)。
關(guān)注就有內(nèi)部資源!
總結(jié)
以上是生活随笔為你收集整理的假设以带头结点的循环链表表示队列_[leetcode链表系列]2 删除链表中的节点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python开机自动运行_python
- 下一篇: 如何搭建socks5和ss节点_以太坊区