成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用O(1)的時間復雜度刪除鏈表節點

開發 前端
在單向鏈表中,要想刪除一個節點,首先想到的做法就是:從鏈表的頭節點開始,按照順序遍歷查找要刪除的節點,找到后改變指針指向即可完成節點刪除。

前言

有一個單向鏈表,給定了頭指針和一個節點指針,如何在O(1)的時間內刪除該節點?本文將分享一種實現思路來解決這個問題,歡迎各位感興趣的開發者閱讀本文。

思路分析

在單向鏈表中,要想刪除一個節點,首先想到的做法就是:從鏈表的頭節點開始,按照順序遍歷查找要刪除的節點,找到后改變指針指向即可完成節點刪除。

遍歷鏈表,刪除節點

接下來,我們舉個鏈表的例子,刪除 節點10 ,那么刪除過程就如下圖所示:

  1. 從鏈表頭部通過遍歷的方式順著指針進行查找
  2. 發現節點9的指針指向節點10(需要刪除的節點)
  3. 獲取節點10指針指向的節點13
  4. 修改節點9的指針指向,將其指向節點13,就完成了節點10的刪除

通過這種方式,我們的確刪除了給定的節點,但是需要從頭開始遍歷鏈表尋找節點,時間復雜度是O(n)。不滿足題目要求,這種方式不可行。

覆蓋節點,實現刪除

接下來,我們換一種思路,既然最耗時的地方是遍歷尋找節點,那么我們就不遍歷了,充分利用題目所給條件來進一步思考。

再次審題后,我們發現它給出了要刪除節點的指針,那么我們就可以拿到其指針所指向的值,有了這個值,我們就可以:

  • 將待刪除節點值的進行覆蓋
  • 修改指針指向,刪除其下一個節點

我們繼續用上個章節所舉的例子,它的執行過程如下圖所示:

注意:待刪除節點的下一個節點值是最后一個時,我們只需將待刪除節點的指針指向null即可。

如果其下一個節點之后還有節點,那我們只需要獲取那個節點,將其指針指向獲取到的節點即可,如下圖所示:

image-20220210213628642

通過上述思路我們在O(1)的時間內刪除了給定節點,但是還有一個問題:如果要刪除的節點位于鏈表的尾部,那么它就沒有下一個節點,此時我們就不能用這個辦法了,只能順序遍歷得到該節點的前序節點,并完成刪除操作。

時間復雜度分析:對于n-1個非尾節點而言,我們可以在O(1)的時間內利用節點覆蓋法實現刪除,但是對于尾節點而言,我們仍然需要按序遍歷來刪除節點,時間復雜度是O(n)。那么,總的時間復雜度就為:[(n-1) * O(1) + O(n)] / n,最終結果還是 O(1),符合題目要求。

如果鏈表中只有一個節點,而我們又要刪除鏈表的頭節點(也是尾節點),那么,此時我們在刪除節點之后還需要把鏈表的頭節點設置為null。

實現代碼

有了思路之后,我們就能愉快的寫出代碼了,如下所示:

  • 鏈表中只有1個節點時,直接返回nul,調用者刪除鏈表的頭部節點即可
  • 待刪除節點無下一個節點時,則按序遍歷尋找到其上一個節點,將指針指向null即可
  • 使用覆蓋節點法,完成節點的刪除
type ListNode = { element: number; next: ListNode | null };

export class DeleteLinkedListNode {
deleteNode(listHead: ListNode, toBeDeleted: ListNode): ListNode | null {
// 鏈表中只有一個節點時,返回null
if (listHead.next == null) {
return null;
}
// 待刪除節點處于末尾時,則按順序遍歷節點實現刪除
if (toBeDeleted.next == null) {
let curNode = listHead.next;
// 尋找待刪除節點的上一個節點
while (
curNode.next != null &&
curNode.next.element !== toBeDeleted.element
) {
curNode = curNode.next;
}
// 上一個節點已找到,將其指針指向null即可
curNode.next = null;
return listHead;
}

// 待刪除節點之后還有節點,則采取覆蓋法以達到刪除的目的
// 待刪除節點的值改為其下一個節點的值
toBeDeleted.element = toBeDeleted.next.element;
// 待刪除節點的指針指向待刪除節點的下下個節點
toBeDeleted.next = toBeDeleted.next.next;
return listHead;
}
}

測試用例

最后,我們用上個章節所舉的例子來驗證下代碼是否能正確執行。

import { DeleteLinkedListNode } from "../DeleteLinkedListNode.ts";
import LinkedList from "../lib/LinkedList.ts";

const listNode = new LinkedList();
listNode.push(3);
listNode.push(5);
listNode.push(7);
listNode.push(9);
listNode.push(10);
listNode.push(13);
listNode.push(15);

const deleteLinkedListNode = new DeleteLinkedListNode();
// 獲取鏈表頭指針與節點10的指針
const result = deleteLinkedListNode.deleteNode(
listNode.getHead(),
listNode.getElementAt(4)
);
if (result == null) {
// 刪除鏈表的頭節點
listNode.removeAt(0);
}
console.log("刪除節點10后,鏈表的剩余節點為:", listNode.toString());

運行結果如下所示:

上述代碼中的LinkedList類是自己實現的,對此感興趣的開發者請移步:鏈表與變相鏈表的實現[1]。

示例代碼

本文實例的完整代碼如下:

  • DeleteLinkedListNode.ts[2]
  • deleteLinkedListNode-test.ts[3]
  • LinkedList.ts[4]

寫在最后

至此,文章就分享完畢了。

我是神奇的程序員,一位前端開發工程師。

如果你對我感興趣,請移步我的個人網站[5],進一步了解。

  • 文中如有錯誤,歡迎在評論區指正,如果這篇文章幫到了你,歡迎點贊和關注??
  • 文中鏈接可從文末參考資料中獲取

參考資料

[1]鏈表與變相鏈表的實現: https://juejin.cn/post/6844904176229548039

[2]DeleteLinkedListNode.ts: https://github.com/likaia/algorithm-practice/blob/04791ec8b301c78d195e1d638e2b8260c53d7c69/src/DeleteLinkedListNode.ts#L3

[3]deleteLinkedListNode-test.ts: https://github.com/likaia/algorithm-practice/blob/04791ec8b301c78d195e1d638e2b8260c53d7c69/src/test-case/deleteLinkedListNode-test.ts#L4

[4]LinkedList.ts: https://github.com/likaia/algorithm-practice/blob/212a5351f662ddf48bab2c289194bb09c378d9a1/src/lib/LinkedList.ts#L9

[5]個人網站: https://www.kaisir.cn/


責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2019-02-21 09:55:39

單鏈表存儲C結點

2020-11-30 06:26:31

算法時間表示法

2024-04-25 08:33:25

算法時間復雜度空間復雜度

2019-11-18 12:41:35

算法Python計算復雜性理論

2020-02-06 13:59:48

javascript算法復雜度

2021-01-05 10:41:42

算法時間空間

2022-10-20 08:51:40

跳表復雜度索引

2009-07-09 10:45:16

C#基本概念復雜度遞歸與接口

2023-07-27 07:28:04

存儲鏈表HashSet

2020-09-08 15:40:58

算法快速排序堆排序

2021-10-15 09:43:12

希爾排序復雜度

2024-05-20 09:04:29

時間復雜度代碼

2021-09-17 10:44:50

算法復雜度空間

2015-10-13 09:43:43

復雜度核心

2020-12-30 09:20:27

代碼

2014-12-10 09:23:14

2020-11-10 09:17:03

Redis

2021-06-28 06:15:14

算法Algorithm時間空間復雜度

2018-07-31 09:52:38

機器學習排序算法圖像處理

2020-12-30 05:35:56

數據結構算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区久久 | 国产一区二区精品在线 | 午夜影院在线观看免费 | 成人av在线播放 | 91精品国产91| 日韩网站在线观看 | 成人免费在线播放视频 | av黄色在线观看 | 亚洲福利一区二区 | 免费三级网站 | a级黄色片在线观看 | 丁香婷婷综合激情五月色 | 国产高清精品一区二区三区 | 69性欧美高清影院 | 国产伦精品一区二区三区四区视频 | 免费同性女女aaa免费网站 | 欧美理论 | 欧美在线视频不卡 | 秋霞电影一区二区 | 99综合| 免费不卡视频 | 97人澡人人添人人爽欧美 | 久久精品一区 | 成人精品视频在线观看 | 亚洲97 | 91视频正在播放 | 不卡一区 | 999精品网| 欧美精品一区二区三区在线播放 | 国产1区 | 最新日韩在线 | 国产激情在线观看 | 国产精品国产精品国产专区不片 | 国产一区欧美一区 | 亚洲色综合| 欧美成人精品一区二区男人看 | 日韩免费高清视频 | 日韩三级在线 | 久久久久久久久久久一区二区 | www.免费看片.com | 国产一区二区三区在线视频 |