leetcode 237. 删除链表中的节点(左神算法:一种怪异的节点删除方式、此方法存在的问题分析)
題目
題解
一種怪異的節(jié)點(diǎn)刪除方式
本題的思路很簡單,舉例就能說明具體的做法。
例如,鏈表1->2->3->null,只知道要?jiǎng)h除節(jié)點(diǎn)2,而不知道頭節(jié)點(diǎn)。那么只需把節(jié)點(diǎn)2 的值變成節(jié)點(diǎn)3 的值,然后在鏈表中刪除節(jié)點(diǎn)3 即可。
這道題目出現(xiàn)的次數(shù)很多,這么做看起來非常方便,但 其實(shí)是有很大問題的。
存在的問題一
這樣的刪除方式 無法刪除最后一個(gè)節(jié)點(diǎn)。還是以原示例來說明,如果知道要?jiǎng)h除節(jié)點(diǎn)3,而不知道頭節(jié)點(diǎn)。但它是最后的節(jié)點(diǎn),根本沒有下一個(gè)節(jié)點(diǎn)來代替節(jié)點(diǎn)3 被刪除,那么只有讓節(jié)點(diǎn)2 的next 指向null 這一種辦法,而我們又根本找不到節(jié)點(diǎn)2,所以根本沒法正確刪除節(jié)點(diǎn)3。讀者可能會(huì)問,我們能不能把節(jié)點(diǎn)3 在內(nèi)存上的區(qū)域變成null 呢?這樣不就相當(dāng)于讓節(jié)點(diǎn)2 的next 指針指向了null,起到節(jié)點(diǎn)3 被刪除的效果了嗎?不可以。null 在系統(tǒng)中是一個(gè)特定的區(qū)域,如果想讓節(jié)點(diǎn)2 的next 指針指向null,必須找到節(jié)點(diǎn)2。
存在的問題二
這種刪除方式在本質(zhì)上根本就不是刪除了node 節(jié)點(diǎn),而是把node 節(jié)點(diǎn)的值改變,然后刪除node 的下一個(gè)節(jié)點(diǎn),在 實(shí)際的工程中可能會(huì)帶來很大問題。
-
比如,工程上的一個(gè)節(jié)點(diǎn)可能代表很復(fù)雜的結(jié)構(gòu),節(jié)點(diǎn)值的復(fù)制會(huì)相當(dāng)復(fù)雜,或者可能改變節(jié)點(diǎn)值這個(gè)操作都是被禁止的;
-
再如,工程上的一個(gè)節(jié)點(diǎn)代表提供服務(wù)的一個(gè)服務(wù)器,外界對(duì)每個(gè)節(jié)點(diǎn)都有很多依賴,比如,示例中刪除節(jié)點(diǎn)2 時(shí),其實(shí)影響了節(jié)點(diǎn)3 對(duì)外提供的服務(wù)。
這種刪除方式具體看如下代碼。
class ListNode {int val;ListNode next;ListNode(int x) {val = x;} }public class Solution {public void deleteNode(ListNode node) {node.val = node.next.val;node.next = node.next.next;} }總結(jié)
以上是生活随笔為你收集整理的leetcode 237. 删除链表中的节点(左神算法:一种怪异的节点删除方式、此方法存在的问题分析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 235. 二叉搜索树的
- 下一篇: 面试必会系列 - 5.1 网络BIO、N