最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)據(jù)結(jié)構(gòu)TypeScript之鏈表實(shí)現(xiàn)詳解

 更新時(shí)間:2023年01月30日 09:40:59   作者:前端技術(shù)獺  
這篇文章主要為大家介紹了數(shù)據(jù)結(jié)構(gòu)TypeScript之鏈表實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

鏈表結(jié)構(gòu)特點(diǎn)

鏈表線性表的其中一種,用于存儲(chǔ)有固定順序的元素。而元素之間會(huì)通過”鏈“連接在一起。

鏈表存儲(chǔ)的元素稱為節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)內(nèi)部存在兩個(gè)值。如下:

  • this.element:鏈表需要存儲(chǔ)的單個(gè)元素
  • this.next:指向下一個(gè)節(jié)點(diǎn),也就是鏈表中的”鏈“,將節(jié)點(diǎn)連接在一起。

嘗試手動(dòng)構(gòu)建鏈表結(jié)構(gòu)。過程如下:

class LinkedListNode {
    constructor(element) {
        this.element = element  // 鏈表要存儲(chǔ)的值
        this.next = null        // 當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
    }
}
let A = new LinkedListNode('A') // 第一個(gè)節(jié)點(diǎn)A
let B = new LinkedListNode('B') // 第二個(gè)節(jié)點(diǎn)B
let C = new LinkedListNode('C') // 第三個(gè)節(jié)點(diǎn)C
// 節(jié)點(diǎn)之間通過this.next屬性值連起來,如下:
A.next = B // 節(jié)點(diǎn)A下一個(gè)是節(jié)點(diǎn)B
B.next = C // 節(jié)點(diǎn)B下一個(gè)是節(jié)點(diǎn)C
console.log(A) // 輸出鏈表:A -> B -> C

面向?qū)ο蠓椒ǚ庋b鏈表

構(gòu)造函數(shù)

基本單元:鏈表節(jié)點(diǎn)

class LinkedListNode {
    element: any
    next: (null | LinkedListNode)
    constructor(element: any) {
        this.element = element
        this.next = null
    }
}

主體:鏈表

class LinkedList {
    length: number
    head: (null | LinkedListNode)
    constructor() {
        this.length = 0
        this.head = null
    }
}

查找節(jié)點(diǎn)

設(shè)計(jì)一個(gè)方法,可以獲取當(dāng)前節(jié)點(diǎn)的前中后三個(gè)節(jié)點(diǎn)。這樣可以極大的方便接下來的增刪操作。如下:

getLinkedListNode(index: number): (void | { [index: number]: (null | LinkedListNode) }) {
    if (this.isEmpty()) {
        throw new Error('LinkedList is empty')
    } else if (index < 0 || index >= this.length) {
        throw new Error(`${index} does exist in [0, ${this.length})`)
    } else if (index >= 0 && index < this.length) {
        let previous: (null | LinkedListNode) = null
        let current: (null | LinkedListNode) = this.head
        for (let i = 0; i < index; i++) {
            previous = current
            current = current!.next
        }
        return { 0: previous, 1: current, 2: current!.next }
    }
}

增加節(jié)點(diǎn)

新節(jié)點(diǎn)可插入的范圍:index >= 0 && index <= this.length。也就是說,可以在每個(gè)節(jié)點(diǎn)的前后都可以插入新的節(jié)點(diǎn)。

增加節(jié)點(diǎn)的情況分為四種,如下分析:

  • 鏈表為空,不存在節(jié)點(diǎn):直接將新節(jié)點(diǎn)的值賦給頭節(jié)點(diǎn)。
  • 在頭部之前插入節(jié)點(diǎn)(存在index參數(shù)且范圍符合):利用新節(jié)點(diǎn)的next緩存當(dāng)前頭節(jié)點(diǎn),然后新節(jié)點(diǎn)覆蓋頭節(jié)點(diǎn)。
  • 在兩個(gè)節(jié)點(diǎn)之間插入節(jié)點(diǎn)(存在index參數(shù)且范圍符合):利用新節(jié)點(diǎn)的next緩存當(dāng)前節(jié)點(diǎn),改變前一個(gè)節(jié)點(diǎn)的next指向新節(jié)點(diǎn)。
  • 在尾部插入節(jié)點(diǎn):遍歷到最后一個(gè)節(jié)點(diǎn),在節(jié)點(diǎn)末尾插入節(jié)點(diǎn)。
insert(element: any, index?: number): LinkedList {
    let node: (null | LinkedListNode) = new LinkedListNode(element)
    if (this.isEmpty()) {
        this.head = node
    } else if (index !== undefined && (index >= 0 && index < this.length)) {
        if (index === 0) {
            node.next = this.head
            this.head = node
        } else {
            let current: (void | object) = this.getLinkedListNode(index)
            node.next = current[0]!.next
            current[0]!.next = node
        }
    } else if (index !== undefined && (index < 0 || index > this.length)) {
        throw new Error(`${index} does exist in [0, ${this.length}]`)
    } else if (index === undefined || index === this.length) {
        let current: (null | LinkedListNode) = this.head
        while (current!.next !== null) {
            current = current!.next
        }
        current!.next = node
    }
    this.length++
    return this
}

刪除節(jié)點(diǎn)

鏈表節(jié)點(diǎn)的刪除范圍:index >= 0 && index < this.length。打個(gè)比方,鏈表長度為3,那么可刪除的位置為0,1,2。

刪除節(jié)點(diǎn)的情況分為三種,如下分析:

  • 刪除頭節(jié)點(diǎn):鏈表長度為1,頭節(jié)點(diǎn)置空。鏈表長度大于1,頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)覆蓋當(dāng)前頭節(jié)點(diǎn)。
  • 刪除中間節(jié)點(diǎn)(存在index參數(shù)且范圍符合):前一個(gè)節(jié)點(diǎn)的next直接指向當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
  • 刪除尾節(jié)點(diǎn):找到尾節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),將它的next屬性置空。

注意:每次刪除都將改變鏈表的長度,而節(jié)點(diǎn)的刪除位置也會(huì)跟著改變。

remove(index: number): LinkedList {
    if (this.isEmpty()) {
        throw new Error('LinkedList is empty')
    } else {
        if (index === 0) {
            this.head = (this.length === 1) ? null : this.head!.next
        } else if (index > 0 && index < this.length) {
            let current: (void | object) = this.getLinkedListNode(index)
            current[0]!.next = (index + 1 === this.length) ? null : current[2]
        } else {
            throw new Error(`${index} does exist in [0, ${this.length})`)
        }
        this.length--
        return this
    }
}

本文相關(guān)代碼已放置我的Github倉庫 ??

項(xiàng)目地址:Algorithmlib|LinkedList

以上就是數(shù)據(jù)結(jié)構(gòu)TypeScript之鏈表實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于TypeScript數(shù)據(jù)結(jié)構(gòu)鏈表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • TypeScript 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)哈希表 HashTable教程

    TypeScript 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)哈希表 HashTable教程

    這篇文章主要為大家介紹了TypeScript 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)哈希表 HashTable教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Xterm.js入門官方文檔示例詳解

    Xterm.js入門官方文檔示例詳解

    這篇文章主要為大家介紹了Xterm.js入門官方文檔示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 數(shù)據(jù)結(jié)構(gòu)TypeScript之鄰接表實(shí)現(xiàn)示例詳解

    數(shù)據(jù)結(jié)構(gòu)TypeScript之鄰接表實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了數(shù)據(jù)結(jié)構(gòu)TypeScript之鄰接表實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • TypeScript 基本數(shù)據(jù)類型實(shí)例詳解

    TypeScript 基本數(shù)據(jù)類型實(shí)例詳解

    這篇文章主要為大家介紹了TypeScript 基本數(shù)據(jù)類型實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Underscore.js常用方法總結(jié)

    Underscore.js常用方法總結(jié)

    這篇文章主要介紹了Underscore.js常用方法總結(jié),本文講解了Underscore.js概述、在node.js下安裝、與集合有關(guān)的方法、與對(duì)象有關(guān)的方法、與函數(shù)相關(guān)的方法等內(nèi)容,需要的朋友可以參考下
    2015-02-02
  • FastAdmin表單驗(yàn)證data-rule插件—Nice-validator的使用方法

    FastAdmin表單驗(yàn)證data-rule插件—Nice-validator的使用方法

    FastAdmin的表單驗(yàn)證data-rule非常方便,也很炫酷,采用的Nice-validator是一款非常強(qiáng)大的表單驗(yàn)證插件,通過簡單在元素上配置規(guī)則,即可達(dá)到驗(yàn)證的效果,怎么使用Nice-validator插件呢
    2023-09-09
  • 使用JS?的download庫在瀏覽器直接下載文件

    使用JS?的download庫在瀏覽器直接下載文件

    一般情況下web項(xiàng)目的瀏覽器下載文件,都是使用form表單或者ajax向后端提交數(shù)據(jù),發(fā)送請(qǐng)求,后端文件的URL地址或者二進(jìn)制文件流。這篇文章主要介紹了使用JS?的download庫在瀏覽器直接下載文件。
    2022-12-12
  • 使用three.js 畫漸變的直線

    使用three.js 畫漸變的直線

    這篇文章主要介紹了使用three.js 畫漸變的直線的相關(guān)資料以及具體的實(shí)例代碼,有需要的小伙伴可以參考下
    2016-06-06
  • TypeScript類型實(shí)現(xiàn)加減乘除詳解

    TypeScript類型實(shí)現(xiàn)加減乘除詳解

    這篇文章主要為大家介紹了TypeScript類型實(shí)現(xiàn)加減乘除示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • rollup?cli開發(fā)全面系統(tǒng)性rollup源碼分析

    rollup?cli開發(fā)全面系統(tǒng)性rollup源碼分析

    這篇文章主要為大家介紹了rollup?cli開發(fā)全網(wǎng)系統(tǒng)性rollup源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

开化县| 泰安市| 内江市| 台北县| 佛冈县| 松滋市| 镇巴县| 慈利县| 乌拉特中旗| 察隅县| 辉南县| 修武县| 邢台县| 黑河市| 郑州市| 罗源县| 绍兴县| 呼玛县| 和林格尔县| 蓬溪县| 盐津县| 中西区| 高陵县| 青州市| 永嘉县| 白沙| 册亨县| 蒲城县| 雷州市| 黄龙县| 罗定市| 安龙县| 土默特左旗| 油尖旺区| 观塘区| 无棣县| 财经| 合阳县| 永泰县| 工布江达县| 碌曲县|