久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

JS數據結構之鏈表的優點是什么-創新互聯

這篇文章給大家分享的是有關JS數據結構之鏈表的優點是什么的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名與空間、虛擬空間、營銷軟件、網站建設、故城網站維護、網站推廣。

在本文中,我們將討論如何將鏈表存儲在數據庫中,實現鏈表的添加和刪除,查找以及反轉鏈表等操作。 在實現鏈表之前,需要知道相比數組和對象,鏈表的優點是什么。

我們知道,數組中的元素以索引編號和順序存儲在數據庫中:

JS數據結構之鏈表的優點是什么

在使用數組時,在開始或特定索引處添加/刪除元素這樣的操作可能是一項性能較低的任務,因為我們必須移動所有其他元素的索引,造成這種原因是由數組的編號索引特性導致的。

使用對象可以解決上述問題。 由于在對象中,元素存儲位置是隨機的,因此,在執行諸如在開始處或特定索引處添加/刪除元素之類的操作時,無需移動元素的索引:

JS數據結構之鏈表的優點是什么

盡管在對象中添加和刪除元素速度很快,但是從上圖可以看出,在進行迭代操作時,對象并不是很好選擇,因為對象的元素存儲在隨機位置。 因此,迭代操作可能需要很長時間。 這是鏈表引出的原因。

那么什么是鏈表呢 ?

從名字本身可以看出它是一個以某種方式鏈表。 那么它是如何鏈接的,列表包含什么呢?

鏈表由具有兩個屬性的節點組成:數據和指針

節點內的指針指向列表中的下一個節點。 鏈表中的第一個節點稱為head。 為了更好地理解,讓我們看一下描述鏈表圖示:

JS數據結構之鏈表的優點是什么

從上圖可以看出,每個節點都有兩個屬性,datapointer。 指針指向列表中的下一個節點,最后一個節點的指針指向null,上圖是一個單鏈表 ?。

鏈表和對象時有很大的不同。 在鏈表中,每個節點都通過指針(pointer)連接到下一個節點。 因此,我們在鏈表的每個節點之間都有連接,而在對象中,鍵值對是隨機存儲的,彼此之間沒有連接。

接著,我們實現一個存儲整數的鏈表。 由于 JS 不提供內置的鏈表支持,因此我們將使用對象和類來實現鏈表 ?

class Node {
  constructor (value) {
    this.value = value
    this.next = null
  }
}

class LinkedList {
  constructor () {
    this.head = null
    this.tail = this.head
    this.length = 0
  }
  append (value) {
  }

  prepend (value) {

  }

  insert (value, index) {

  }

  lookup (index) {

  }

  remove (index) {

  }

  reverse () {
    
  }
}

在上面的代碼中,我們創建了兩個類,一個用于來鏈表本身,一個是節點本身。 如我們所討論的,每個節點將具有兩個屬性,一個和一個指針(對應next 字段)。

LinkedList類包含三個屬性,head(初始值為null),用于存儲鏈表的最后一個節點的tail(也指向null)和用于保存鏈表長度的length屬性。接著,我們來實現里面的方法 ?。

append (按順序添加值)

這個函數將一個節點添加到鏈表的末尾。為了實現這個函數,我們需要理解它需要執行的一些操作:

JS數據結構之鏈表的優點是什么

從上圖中,我們可以通過以下方式實現append函數:

  append (value) {
    const newNode = new Node(value)
    if (!this.head) {
      this.head = newNode
      this.tail = newNode
    } else {
      this.tail.next = newNode
      this.tail = newNode
    }
    this.length++
  }

簡單的對append 方法解釋一下 ?:

const linkedList1 = new LinkedList()
linkedList1.append(2)

檢查head是否指向null,此時的head指向null,因此我們創建一個新對象,并將新對象分配給headtail:

let node = new Node(2)
this.head = newNode
this.tail = newNode

現在,headtail 都指向同一個對象,這一點很重要,要記住。

接著,我們再向鏈表添加兩個值:

linkedList1.append(3)
linkedList1.append(4)

現在,head 不指向null,所以我們進入append函數的else分支:

this.tail.next = node

由于headtail 都指向同一個對象,tail的變化都會導致head對象的變化,這是JS 中對象的工作方式。在JavaScript中,對象是通過引用傳遞的,因此headtail都指向存儲對象的相同地址空間。上面這行代碼相當于

this.head.next = node;

下一行:

this.tail = node

現在,在執行完上面的代碼行之后,this.head.nextthis.tail指向同一對象,因此,每當我們添加新節點時,head對象都會自動更新。

執行三次append之后,linkedList1 的結構應該是這樣的:

head: {value: 2 , next: {value: 3, next: {value: 4,next: null}}}
tail : {value: 4, next: null}
length:3

從上面的代碼中我們可以看到,鏈表的append函數的復雜度是O(1),因為我們既不需要移動索引,也不需要遍歷鏈表。

我們來看下一個函數 ?

prepend (將值添加到鏈表的開頭)

為了實現此函數,我們使用Node類創建一個新節點,并將該新節點的下一個對象指向鏈表的head 。 接下來,我們將新節點分配給鏈表的head

與append函數一樣,這個函數的復雜度也是O(1)。

  prepend (value) {
  const node = new Node(value)

  node.next = this.head
  this.head = node
  this.length++
}

就像append函數一樣,此函數的復雜度也為O(1)

insert (在特定索引處添加值)

在實現此函數之前,我們先看看它的一個轉化過程。因此,出于理解目的,我們先創建一個值很少的鏈表,然后可視化insert函數。insert  函數接受兩個參數,值和索引:

let linkedList2 = new LinkedList()
linkedList2.append(23)
linkedList2.append(89)
linkedList2.append(12)
linkedList2.append(3)
linkedList2.insert(45,2)

第1步:

遍歷鏈表,直到到達index-1位置:

JS數據結構之鏈表的優點是什么

第2步:

將索引為1的節點的指針(在本例中為89)分配給新節點(在本例中為45):

JS數據結構之鏈表的優點是什么

第3步:

將新節點(45)的next 指向給下一個節點(12)

JS數據結構之鏈表的優點是什么

這就是執行插入操作的方式。 通過以上可視化,我們觀察到需要在index-1位置和index位置找到節點,以便可以在它們之間插入新節點。 在代碼中實現:

insert (value, index) {
  if (index >= this.length) {
  this.append(value)
}

  const node = new Node(value)

  const { prevNode, nextNode } = thisg.getPrevNextNodes(index)
  prevNode.next = node
  node.next = nextNode

  this.length++
}

簡單分析一下上面的函數:

如果index的值大于或等于length屬性,則將操作移交給append函數。 對于else 分支,我們使用 Node 類創建一個新節點,接下來觀察一個新函數getPrevNextNodes(),通過該函數我們可以接收prevNodenextNode的值。getPrevNextNodes函數的實現如下:

 getPrevNextNodes(index){
    let count = 0;
    let prevNode = this.head;
    let nextNode = prevNode.next;

    while(count < index - 1){
      prevNode = prevNode.next;
      nextNode = prevNode.next;
      count++;
    }

    return {
      prevNode,
      nextNode
    }
  }

通過遍歷鏈表返回在index-1位置和index位置的節點,并將prevNodenext屬性指向新節點,并將新節點的next屬性指向nextNode

鏈表的插入操作的復雜度為O(n),因為我們必須遍歷鏈表并在index-1index 位置搜索節點。 盡管復雜度為O(n),但我們發現此插入操作比對數組的插入操作快得多,在數組中,我們必須將所有元素的索引移到特定索引之后,但是在鏈接中,我們僅操縱index-1index 位置的節點的下一個屬性。

remove (刪除特定索引處的元素)

實現了插入操作之后,刪除操作就比較容易理解,因為它幾乎與插入操作相同,當我們從getPrevNextNodes函數獲取prevNodenextNode值時,我們必須在remove中執行以下操作:

remove(index){
  let {previousNode,currentNode} = this.getNodes(index)
  previousNode.next = currentNode.next
  this.length--
}

刪除操作的復雜度也為O(n),類似于插入操作,鏈表中的刪除操作比數組中的刪除操作要快。

reverse (反轉鏈表)

雖然看起來很簡單,但反轉鏈表常常是實現起來最令人困惑的操作,因此,在面試中會經常詢問這個操作。在實現這個函數之前,讓我們先把反轉鏈表的策略可視化一下。

為了反轉鏈表,我們需要跟蹤三個節點,previousNodecurrentNodenextNode

考慮下面的鏈表:

let linkedList2 = new LinkedList()
linkedList2.append(67)
linkedList2.append(32)
linkedList2.append(44)

第一步:

開始,previousNode的值為null,而currentNode的值為head

JS數據結構之鏈表的優點是什么

第二步:

接下來,我們將nextNode分配給currentNode.next

JS數據結構之鏈表的優點是什么

第三步:

接下來,我們將currentNode.next屬性指向previousNode

JS數據結構之鏈表的優點是什么

第三步:

現在,我們將previousNode移至currentNode,將currentNode移至nextNode

JS數據結構之鏈表的優點是什么

這個過程從步驟2重復操作,一直到currentNode 等于null

reverse (){
  let previousNode = null
  let currentNode = this.head

  while(currentNode !== null) {
    let nextNode = currentNode.next
    currentNode.next = previousNode
    previousNode = currentNode
    currentNode = nextNode
  }

  this.head = previousNode
}

就像我們看到的一樣,直到currentNode === null,我們一直在遍歷和移動這些值。 最后,我們將previousNode值分配給head

反向運算的復雜度為O(n)

查找 (查找特定索引的值)

這個操作很簡單,我們只是遍歷鏈表并返回特定索引處的節點。這個操作的復雜度也是O(n)

lookup(index){
    let counter = 0;
    let currentNode = this.head;
    while(counter < index){
      currentNode = currentNode.next;
      counter++;
    }
    return currentNode;
  }

好了,我們已經完成了用javascript實現單個鏈表的基本操作。單鏈表和雙鏈表的區別在于,雙鏈表的節點具有指向前一個節點和下一個節點的指針。

鏈表為我們提供了快速的append(末尾添加元素)和prepend(開頭添加元素)操作。 盡管鏈表中的插入操作的復雜度為O(n),但比數組的插入操作要快得多。 使用數組時我們面臨的另一個問題是大小復雜性,當使用動態數組時,在添加元素時,我們必須將整個數組復制到另一個地址空間,然后添加元素,而在鏈表中,我們不需要 面對這樣的問題。

在使用對象時,我們面臨的問題是元素在內存中的隨機位置,而在鏈表中,節點是通過指針相互連接的,指針提供了一定的順序。

感謝各位的閱讀!關于“JS數據結構之鏈表的優點是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

新聞名稱:JS數據結構之鏈表的優點是什么-創新互聯
文章起源:http://www.js-pz168.com/article18/csgddp.html

成都網站建設公司_創新互聯,為您提供電子商務網站收錄域名注冊網頁設計公司營銷型網站建設網站維護

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都做網站
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
成人欧美一区二区三区在线观看 | 亚洲综合色网站| 美女视频黄 久久| 99久久精品免费| 日韩精品大片| 91精品国产免费久久综合| 国产精品无人区| 蜜桃av一区二区三区| 91丝袜美女网| 色综合天天综合网天天看片| 精品日韩一区二区三区 | 精品国产乱码久久久久久牛牛| 亚洲天堂av老司机| 国产真实乱偷精品视频免| 国产精品v欧美精品v日韩| 日本精品视频一区二区| 国产日韩精品视频一区| 天天色 色综合| 97se亚洲综合在线| 欧美在线免费视屏| 中文字幕一区av| 国产精品影视网| 日韩精品电影网站| 久久综合成人精品亚洲另类欧美 | 色爱区成人综合网| 日韩精品一区在线观看| 午夜在线成人av| 97超碰欧美中文字幕| 91久久线看在观草草青青| 欧美激情中文不卡| 国模冰冰炮一区二区| 久久久免费看| 精品欧美久久久| 日韩电影网1区2区| 高清国语自产拍免费一区二区三区| 欧美四级电影网| 亚洲精品一卡二卡| 99re热视频精品| 欧美亚洲尤物久久| 亚洲精品视频自拍| 91网站最新网址| 欧美日韩免费在线视频| 亚洲综合免费观看高清完整版在线 | 精品一区二区在线播放| 免费观看成人在线| 久久嫩草精品久久久精品| 蜜臀99久久精品久久久久久软件| 精品国产综合| 精品国产伦一区二区三区观看方式| 秋霞电影一区二区| 欧美二区三区在线| 国产校园另类小说区| 国产一区二区h| 在线观看成人av| 日韩美女啊v在线免费观看| 不卡大黄网站免费看| 欧美三级电影在线观看| 亚洲一级电影视频| 狠狠久久综合婷婷不卡| 亚洲精品一区二区三区四区高清| 久久国产欧美日韩精品| 先锋影音一区二区三区| 亚洲欧美在线另类| 91在线观看下载| 日韩一区二区影院| 久久精工是国产品牌吗| 亚洲国产精品一区二区第四页av| 国产精品麻豆视频| 99久久婷婷国产精品综合| 欧美精品丝袜久久久中文字幕| 三级欧美韩日大片在线看| 欧美日韩亚洲免费| 国产精品毛片大码女人| 91浏览器在线视频| 欧美mv日韩mv亚洲| 国产精品主播直播| 欧美午夜精品免费| 日本午夜一区二区| 亚洲精品不卡| 亚洲自拍偷拍图区| 久久久com| 中文字幕一区二区三区色视频| 97中文在线观看| 久久久久久97三级| 成人97人人超碰人人99| 欧美一区二区三区爱爱| 国产乱对白刺激视频不卡| 欧美日韩在线播放三区四区| 日韩黄色在线观看| 伊人久久大香线蕉精品| 亚洲国产精品尤物yw在线观看| 欧美久久综合性欧美| 亚洲人午夜精品天堂一二香蕉| 国产女人水真多18毛片18精品| 欧美激情综合五月色丁香小说| 99re这里都是精品| 久久久久久久久99精品| 91伊人久久大香线蕉| 久久久久久免费| 91精品久久久久久蜜桃| 久久久久久**毛片大全| wwwxx欧美| 国产精品三级在线观看| 国产日韩一区二区| 自拍偷拍亚洲激情| 欧美精品123| 亚洲午夜私人影院| 亚洲砖区区免费| 日韩电影在线观看电影| 欧美在线观看视频一区二区| 久久 天天综合| 91精品国产一区二区三区蜜臀 | 青青草精品视频| 欧美伊人久久久久久午夜久久久久| 麻豆精品久久久| 欧美精品日韩综合在线| 国产成人久久精品77777最新版本| 欧美一级日韩一级| 99久久国产综合精品女不卡| 久久久精品免费免费| 国产综合第一页| 有坂深雪av一区二区精品| 亚洲一卡二卡三卡四卡无卡网站在线看| 五月天激情综合网| 欧美熟乱第一页| 国产成人午夜视频| 久久久久久久久久久电影| 国产精品一区在线播放| 有码一区二区三区| 色哟哟精品一区| 国产一区不卡在线| 久久久久久久综合狠狠综合| 国产久一道中文一区| 亚洲一二三专区| 欧美最猛性xxxxx直播| 国产成人免费视| 国产亚洲欧美日韩俺去了| 九九九九精品九九九九| 无码av免费一区二区三区试看 | 中文字幕欧美区| 欧美日韩综合久久| 蜜臀国产一区二区三区在线播放| 欧美久久久久久蜜桃| 97久久超碰精品国产| 18成人在线观看| 宅男一区二区三区| 国产精品亚洲第一区在线暖暖韩国 | 九色综合国产一区二区三区| 欧美大片日本大片免费观看| 国产精品乱码一区二区三区| 一级做a爱片久久| 欧美自拍丝袜亚洲| 成人avav影音| 亚洲视频香蕉人妖| 欧美在线一二三| 91亚洲国产成人精品一区二区三 | 99久久国产免费看| 亚洲乱码日产精品bd| 欧美系列日韩一区| 91亚洲男人天堂| 亚洲宅男天堂在线观看无病毒| 欧美日韩三级一区二区| 444亚洲人体| 亚洲超碰精品一区二区| 宅男噜噜噜66一区二区66| 国产精品久久国产精品| 日韩精品国产欧美| 精品久久久久久久一区二区蜜臀| 欧美高清性xxxxhd | 亚洲一区二区欧美激情| 777亚洲妇女| 精品一区二区三区国产| 久久精品噜噜噜成人88aⅴ| 国产午夜精品久久久久久免费视 | 日本亚洲自拍| 国产精品911| 亚洲日本在线a| 欧美精品在线一区二区三区| 国产伦精品一区二区三区四区免费| 日韩黄色在线观看| 久久精品亚洲一区二区三区浴池| 亚洲欧洲精品一区| 9人人澡人人爽人人精品| 亚洲自拍偷拍麻豆| 精品国产一区二区三区av性色| 品久久久久久久久久96高清| 国产成人小视频| 亚洲一区二区高清| 精品嫩草影院久久| 一区二区三区在线观看www| 97se亚洲国产综合自在线不卡| 性做久久久久久久久| 久久久久国色av免费看影院| 在线日韩av永久免费观看| 91麻豆福利精品推荐| 男女性色大片免费观看一区二区 | 精品国产制服丝袜高跟| 亚洲欧美精品| 成人欧美一区二区三区视频xxx| 另类欧美日韩国产在线|