摘要:循環(huán)鏈表可以像單向鏈表引用,也可以像雙向鏈表有雙向引用。以下就以如何創(chuàng)建棧數(shù)據(jù)結(jié)構(gòu)為例。
循環(huán)鏈表可以像單向鏈表引用,也可以像雙向鏈表有雙向引用。性能上也跟雙向鏈表差不多,如果position大于length/2,那就可以從尾部開始迭代,可以減少迭代的元素。唯一的區(qū)別在于最后一個元素指向下一個元素的指針(tail.next)不是undefine,而是第一個元素(head)。接下來來看一下循環(huán)鏈表的代碼
循環(huán)鏈表 創(chuàng)建循環(huán)鏈表class CircularLinkedList extends LinkedList { constructor(equalsFn = defaultEquals) { super(equalsFn); }添加操作 尾插法
push(element) { const node = new Node(element); let current; if (this.head == null) { this.head = node; } else { current = this.getElementAt(this.size() - 1); current.next = node; } // set node.next to head - to have circular list node.next = this.head; this.count++; }任意位置添加元素
insert(element, index) { if (index >= 0 && index <= this.count) { const node = new Node(element); let current = this.head; if (index === 0) { if (this.head == null) { // if no node in list this.head = node; node.next = this.head; } else { node.next = current; current = this.getElementAt(this.size()); // update last element this.head = node; current.next = this.head; } } else { const previous = this.getElementAt(index - 1); node.next = previous.next; previous.next = node; } this.count++; return true; } return false; }刪除操作 刪除任意位置元素
removeAt(index) { if (index >= 0 && index < this.count) { let current = this.head; if (index === 0) { if (this.size() === 1) { this.head = undefined; } else { const removed = this.head; current = this.getElementAt(this.size() - 1); this.head = this.head.next; current.next = this.head; current = removed; } } else { // no need to update last element for circular list const previous = this.getElementAt(index - 1); current = previous.next; previous.next = current.next; } this.count--; return current.element; } return undefined; } }
有序鏈表是指保持元素有序的;鏈表結(jié)構(gòu),除了使用排序算法之外,我們還可以將元素插入到正確的位置來保證鏈表的有序性。
有序鏈表 創(chuàng)建有序鏈表const Compare = { LESS_THAN: -1, BIGGER_THAN: 1, EQUALS: 0 }; function defaultCompare(a, b) { if (a === b) { return Compare.EQUALS; } return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN; }; function defaultEquals(a, b) { return a === b; }; class SortedLinkedList extends LinkedList { constructor(equalsFn = defaultEquals, compareFn = defaultCompare) { super(equalsFn); this.equalsFn = equalsFn; this.compareFn = compareFn; };查詢操作
getIndexNextSortedElement(element) { let current = this.head; let i = 0; for (; i < this.size() && current; i++) { const comp = this.compareFn(element, current.element); if (comp === Compare.LESS_THAN) { return i; } current = current.next; } return i; } }添加操作 尾插法
push(element) { if (this.isEmpty()) { super.push(element); } else { const index = this.getIndexNextSortedElement(element); super.insert(element, index); } }任意位置有序添加元素
insert(element, index = 0) { if (this.isEmpty()) { return super.insert(element, index === 0 ? index : 0); } const pos = this.getIndexNextSortedElement(element); return super.insert(element, pos); }
以上就是常見的四種鏈表結(jié)構(gòu),當(dāng)然我們也可以使用鏈表實現(xiàn)其他數(shù)據(jù)結(jié)構(gòu),例如棧,隊列,雙向隊列。以下就以如何創(chuàng)建棧數(shù)據(jù)結(jié)構(gòu)為例。
鏈表創(chuàng)建棧數(shù)據(jù)結(jié)構(gòu)class StackLinkedList { constructor() { this.items = new DoublyLinkedList(); } push(element) { this.items.push(element); } pop() { if (this.isEmpty()) { return undefined; } const result = this.items.removeAt(this.size() - 1); return result; } peek() { if (this.isEmpty()) { return undefined; } return this.items.getElementAt(this.size() - 1).element; } isEmpty() { return this.items.isEmpty(); } size() { return this.items.size(); } clear() { this.items.clear(); } toString() { return this.items.toString(); } }總結(jié)
鏈表相對數(shù)組最大的優(yōu)點就是無需移動鏈表中的元素,就能輕松的添加和移除元素,所以需要實現(xiàn)添加和移除元素操作時,最好的選擇是鏈表而非數(shù)組。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106819.html
摘要:大家在聊到二叉樹的時候,總會離不開鏈表。受限線性表主要包括棧和隊列,受限表示對結(jié)點的操作受限制。存儲結(jié)構(gòu)線性表主要由順序表示或鏈?zhǔn)奖硎?。鏈?zhǔn)奖硎局傅氖怯靡唤M任意的存儲單元存儲線性表中的數(shù)據(jù)元素,稱為線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)。 大家在聊到二叉樹的時候,總會離不開鏈表。這里先帶大家一起了解一些基本概念。 線性表 概念 線性表是最基本、最簡單、也是最常用的一種數(shù)據(jù)結(jié)構(gòu)。 線性表中數(shù)據(jù)元素之間的關(guān)...
摘要:每個線性表上的數(shù)據(jù)最多只有前和后兩個方向。數(shù)組鏈表隊列棧等就是線性表結(jié)構(gòu)。非線性表數(shù)據(jù)之間并不是簡單的前后關(guān)系。不包含任何元素的棧稱為空棧。移除棧頂?shù)脑兀瑫r返回被移除的元素。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 前言 基礎(chǔ)知識就像是一座大樓的地基,它決定了我們的技術(shù)高度。 我們應(yīng)該多掌握一些可移值的...
摘要:一般我們都構(gòu)造雙向循環(huán)鏈表。循環(huán)鏈表的操作和單鏈表的操作基本一致,差別僅僅在于算法中的循環(huán)條件有所不同。單向循環(huán)鏈表雙向循環(huán)鏈表單向循環(huán)鏈表是在單鏈表基礎(chǔ)上,將最后一個節(jié)點的指針指向鏈表頭。 維基百科 雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。一般我們都構(gòu)...
摘要:每個元素由一個存儲元素本身的節(jié)點和一個指向下一個元素的引用也稱指針或鏈接組成。相對于傳統(tǒng)的數(shù)組,鏈表的一個好處在于,添加或移除元素的時候不需要移動其他元素。然而,鏈表需要使用指針,因此實現(xiàn)鏈表時需要額外注意。 本篇主要有三部分 什么是鏈表 鏈表的實現(xiàn) 鏈表的變種 源碼地址:https://github.com/yhtx1997/S... 另外,今天2019年2月18日上午發(fā)現(xiàn) 20...
閱讀 2896·2021-10-14 09:50
閱讀 1237·2021-10-08 10:21
閱讀 3670·2021-10-08 10:16
閱讀 3074·2021-09-27 14:02
閱讀 3149·2021-09-23 11:21
閱讀 2142·2021-09-07 10:17
閱讀 417·2019-08-30 14:00
閱讀 2126·2019-08-29 17:26