摘要:鏈表鏈表存儲有序的元素集合,但不同于數(shù)組,鏈表中的元素在內(nèi)存中并不是連續(xù)放置的。鏈表又包括單向鏈表和雙向鏈表雙向鏈表雙向鏈表與單向鏈表很是相像。但在雙向鏈表中,還有指向上一個節(jié)點的鏈接,是雙向的。
鏈表
鏈表存儲有序的元素集合,但不同于數(shù)組,鏈表中的元素在內(nèi)存中并不是連續(xù)放置的。每個元素由一個存儲元素本事的節(jié)點和一個指向下一個元素的引用組成。相對于傳統(tǒng)的數(shù)組,鏈表的一個好處在于,添加或者刪除元素的時候不需要移動其他元素。
使用鏈表結(jié)構(gòu)可以克服數(shù)組需要預(yù)先知道數(shù)據(jù)大小的缺點(C語言的數(shù)組需要預(yù)先定義長度),鏈表結(jié)構(gòu)可以充分利用計算機內(nèi)存空間,實現(xiàn)靈活的內(nèi)存動態(tài)管理。
數(shù)組和鏈表的一個不同在于數(shù)組可以直接訪問任何位置的元素,而想要訪問鏈表中的一個元素,需要從起點開始迭代列表。
鏈表又包括:單向鏈表 和 雙向鏈表;
雙向鏈表雙向鏈表與單向鏈表很是相像。在單向鏈表中,只有指向下一個節(jié)點的鏈接。但在雙向鏈表中,還有指向上一個節(jié)點的鏈接,是雙向的。
讓我們來簡單實現(xiàn)一個雙向鏈表類,并包含如下功能:
append(element): 添加元素到鏈表尾部
insert(position,element): 向雙向鏈表中某個位置插入元素
removeAt(position): 移除雙向鏈表中某個位置的元素
getHead(): 獲取雙向鏈表的頭部
getTail(): 獲取雙向鏈表的尾部
isEmpty(): 檢查雙向鏈表是否為空,為空則返回true
size(): 返回雙向鏈表長度
代碼如下:
function DoublyLinkedList() { /** * 雙向鏈表中節(jié)點的構(gòu)造函數(shù) * * @param {any} element 要插入鏈表的元素 */ var Node = function (element) { this.element = element; this.next = null; this.prev = null; } // 雙向鏈表的長度 var length = 0; // 雙向鏈表的頭結(jié)點,默認(rèn)為null var head = null; // 雙向鏈表的尾結(jié)點,默認(rèn)為null var tail = null; /** * 添加元素到雙向鏈表的尾部 * * @param {any} element 要插入的元素 */ this.append = function (element) { var node = new Node(element), current = head; if (head === null) { head = node tail = node } else { while (current.next) { current = current.next; } current.next = node; node.prev = current; tail = node; } length++; return true; } /** * 向雙向鏈表中某個位置插入元素 * * @param {any} position 要插入的位置 * @param {any} element 要插入的元素 * @returns 插入成功或失敗 */ this.insert = function (position, element) { var node = new Node(element), current = head, previous, index = 0; // 限制邊界 if (position < 0 && position >= length) { return false; } if (position === 0) { // 在鏈表的頭部插入元素 node.next = head head.prev = node head = node } else if (position === length) { // 在鏈表的尾部插入元素 current = tail; current.next = node; node.prev = current; tail = node; } else { // 在鏈表的中間插入元素 while (index++ < position) { previous = current current = current.next; } // 綁定前一個節(jié)點和插入節(jié)點的關(guān)系 previous.next = node; node.prev = previous; // 綁定后一個節(jié)點和插入節(jié)點的關(guān)系 node.next = current; current.prev = node; } length++; return true; } /** * 移除雙向鏈表中某個位置的元素 * * @param {any} position 要移除元素的位置 * @returns 移除成功,返回移除的元素 */ this.removeAt = function (position) { var previous, current = head, index = 0; // 限制邊界 if (position < 0 && position >= length) { return false; } if (position === 0) { // 移除鏈表的頭部 head = current.next; head.prev = null; } else if(position === length - 1) { // 移除鏈表尾部的元素 current = tail; tail = current.prev; tail.next = null; } else { // 移除鏈表中間的元素 while (index++ < position) { previous = current current = current.next; } previous.next = current.next; current.next.prev = previous; } length--; return current.element; } this.getHead = function () { return head.element; } this.isEmpty = function () { return length === 0 } this.getTail = function () { return tail.element; } this.size = function () { return length } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89273.html
摘要:實現(xiàn)移除給定的元素要移除的元素返回值表示移除成功方法說明移除單向鏈表中某個位置的元素。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法二鏈表 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第四篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與...
摘要:創(chuàng)建雙向鏈表創(chuàng)建節(jié)點繼承添加前繼指針初始化雙向鏈表對鏈表最后一個元素進行引用插入操作尾插法任意位置添加元素刪除操作刪除特定位置的元素查詢操作查詢元素的位置查詢尾部元素修改操作清空雙向鏈表雙向鏈表對象轉(zhuǎn)為字符串 線性表 (List):零個或者多個數(shù)據(jù)元素的有限序列。線性表是一個序列,具有一對一的關(guān)系,而不能具備一對多的關(guān)系。線性表要求有限性,數(shù)據(jù)類型也要相同。本文參考的主要是大話數(shù)據(jù)結(jié)構(gòu)...
摘要:鏈表數(shù)據(jù)結(jié)構(gòu)與算法第五章鏈表數(shù)據(jù)結(jié)構(gòu)鏈表不同與數(shù)組數(shù)組要插入或者移入一個元素的成本很高,因為所有元素都需要移動位置。 JavaScript-鏈表 《Javascript數(shù)據(jù)結(jié)構(gòu)與算法》第五章 5.1 鏈表數(shù)據(jù)結(jié)構(gòu) 鏈表不同與數(shù)組 數(shù)組要插入或者移入一個元素的成本很高,因為所有元素都需要移動位置。 鏈表插入或者移動一個元素時很高效,因為并不需要移動其他的元素位置。 鏈表存儲元素的方式...
摘要:循環(huán)鏈表可以像單向鏈表引用,也可以像雙向鏈表有雙向引用。以下就以如何創(chuàng)建棧數(shù)據(jù)結(jié)構(gòu)為例。 循環(huán)鏈表可以像單向鏈表引用,也可以像雙向鏈表有雙向引用。性能上也跟雙向鏈表差不多,如果position大于length/2,那就可以從尾部開始迭代,可以減少迭代的元素。唯一的區(qū)別在于最后一個元素指向下一個元素的指針(tail.next)不是undefine,而是第一個元素(head)。接下來來看一...
摘要:每個線性表上的數(shù)據(jù)最多只有前和后兩個方向。數(shù)組鏈表隊列棧等就是線性表結(jié)構(gòu)。非線性表數(shù)據(jù)之間并不是簡單的前后關(guān)系。不包含任何元素的棧稱為空棧。移除棧頂?shù)脑?,同時返回被移除的元素。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 前言 基礎(chǔ)知識就像是一座大樓的地基,它決定了我們的技術(shù)高度。 我們應(yīng)該多掌握一些可移值的...
閱讀 1758·2021-11-24 10:18
閱讀 2277·2021-11-18 13:20
閱讀 2366·2021-08-23 09:46
閱讀 1022·2019-08-30 15:56
閱讀 2865·2019-08-30 15:53
閱讀 776·2019-08-30 14:22
閱讀 492·2019-08-29 15:34
閱讀 2561·2019-08-29 12:14