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