线性表

线性表

定义

线性结构的特点:
除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素。
主要操作特点:
可以在任意位置插入和删除一个数据元素。

抽象数据类型

数据集合

$[a_0,a_1,a_2,...,a_{n-1}]$

属性

属性 描述
listSize 当前数据元素个数
pos 列表的当前位置
length 返回列表中元素的个数

方法集合

方法 描述
clear 清空列表中的所有元素
toString 返回列表的字符串形式
getElement 返回当前位置的元素
insert 在现有元素后插入新元素
append 在列表的末尾添加新元素
remove 从列表中删除元素
currPos 返回列表的当前位置

顺序表

顺序存储结构的线性表称作顺序表。

存储结构

function List() {
    this.listSize = 0;
    this.pos = 0;
    
    this.dataStore = []; // 初始化一个空数组来保存列表元素
    this.append = append;
    this.find = find;
    this.remove = remove;
    this.toString = toString;
    this.insert = insert;
    this.clear = clear;
    this.length = length;
}

操作实现

1、append: 给列表添加元素

该方法给列表的下一个位置增加一个新的元素, 这个位置刚好等于变量 listSize 的值:

function append(element) {
    this.dataStore[this.listSize++] = element;
}

当新元素就位后, 变量 listSize 加 1。

2、find: 在列表中查找某一元素

find() 方法通过对数组对象 dataStore 进行迭代, 查找给定的元素。 如果找到, 就返回该元素在列表中的位置, 否则返回 -1。

function find(element) {
    for (var i = 0; i < this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return i;
        }
    } 
    return -1;
}

3、remove: 从列表中删除元素

remove() 方法使用 find() 方法返回的位置对数组 dataStore 进行截取。 数组改变后, 将变量 listSize 的值减 1, 以反映列表的最新长度。 如果元素删除成功, 该方法返回 true, 否则返回 false。

function remove(element) {
    var foundPos = this.find(element);
    if (foundAt > -1) {
        this.dataStore.splice(foundPos,1);
        --this.listSize;
        return true;
    } 
    return false;
}

4、toString: 显示列表中的元素

function toString() {
    return this.dataStore;
}

5、insert: 向列表中插入一个元素

function insert(element, after) {
    var insertPos = this.find(after);
    if (insertPos > -1) {
        this.dataStore.splice(insertPos+1, 0, element);
        ++this.listSize;
        return true;
    } 
    return false;
}

6、clear: 清空列表中所有的元素

使用 delete 操作符删除数组 dataStore, 接着在下一行创建一个空数组。 最
后一行将 listSize 和 pos 的值设为 0, 表明这是一个新的空列表。

function clear() {
    delete this.dataStore;
    this.dataStore = [];
    this.listSize = this.pos = 0;
}

7、length: 列表中有多少个元素

function length() {
    return this.listSize;
}

链表

单链表

设计的链表包含两个类。
Node 类用来表示节点, LinkedList 类提供了插入节点、 删除节点、 显示列表元素的方法, 以及其他一些辅助方法。

结点定义:Node类

Node 类包含两个属性: element 用来保存节点上的数据, next 用来保存指向下一个节点的链接。

function Node(element) {
    this.element = element;
    this.next = null;
}

存储结构:LinkedList类

构造函数, 链表只有一个属性, 那就是使用一个 Node 对象来保存该链表的头节点。

function LList() {
    this.head = new Node("head");
    this.find = find;
    this.insert = insert;
    this.remove = remove;
    this.display = display;
}

head 节点的 next 属性被初始化为 null, 当有新元素插入时, next 会指向新的元素。

操作实现:

LList 类提供了对链表进行操作的方法。

1、find:遍历链表, 查找给定数据

创建一个新节点, 并将链表的头节点赋给这个新创建的节点。 然后在链表上进行循环, 如果当前节点的 element 属性和我们要找的信息不符, 就从当前节点移动到下一个节点。 如果查找成功, 该方法返回包含该数据的节点; 否则, 返回头结点。

function find(item) {
    var currNode = this.head;
    while (currNode.element != item) {
        currNode = currNode.next;
    } 
    return currNode;
}

2、insert:向链表中插入一个节点

向链表中插入新节点时, 需要明确指出要在哪个节点前面或后面插入。
这里的代码给出的是在一个已知节点后面插入元素,因此需要找到“后面” 的节点。

function insert(newElement, item) {
    var newNode = new Node(newElement);
    var current = this.find(item);
    newNode.next = current.next;
    current.next = newNode;
}

3、length:求当前数据元素个数

function length(){
    var current = this.head;
    var listsize = 0;
    while(current.next != null){
        current = current.next;
        ++listsiez;
    }
    return listsize; 
}

4、remove:从链表中删除一个节点

从链表中删除节点时, 需要先找到待删除节点前面的节点。 找到这个节点后, 修改它的next 属性, 使其不再指向待删除节点, 而是指向待删除节点的下一个节点。

function remove(item){
    var prevNode = this.head;
    //找到待删除节点前面的节点
    while (!(prevNode.next == null) && (prevNode.next.element != item)) {
        prevNode = prevNode.next;
    }   
    if (!(prevNode.next == null)) {
        prevNode.next = prevNode.next.next;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 从数据的逻辑结构来分,数据元素之间存在的关联关系被称为数据的逻辑结构。归纳起来,应用程序中的数据大致哟如下四种基本...
    Jack921阅读 918评论 0 2
  • 1.线性表的定义 线性表:零个或多个数据元素的有限序列序列:也就是说元素之间是有顺序的,若元素存在多个,则第一个元...
    e40c669177be阅读 2,035评论 6 15
  • 前言 什么是线性表?线性表的两大存储结构是什么?各种存储结构是如何实现存取、插入删除等操作的?本篇主要解答了这几个...
    JonyFang阅读 1,545评论 4 17
  • 一.线性表 定义:零个或者多个元素的有限序列。也就是说它得满足以下几个条件:  ①该序列的数据元素是有限的。  ②...
    Geeks_Liu阅读 2,693评论 1 12
  • 今天下雨了,我迟到了,但是我没有心情不好,因为早上出门碰到好心人,满路泥泞,下着小雨,眼看着要迟到了,却没有一辆车...
    Mela弓慧园阅读 220评论 0 0