资讯专栏INFORMATION COLUMN

[个人心得]数据结构之单链表

bingchen / 2043人阅读

摘要:一个单向链表包含两个值当前节点的值和一个指向下一个节点的链接。为退出循环即已到了最后一个节点那么它的为加入节点后,要把单链表长度加一。第个节点是运行结果个人源码地址单链表就写到这里咯,接下来还会写其他的数据结构本人也在学习当中。

维基百科

链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。

链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值。

一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接

一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。

从上面可以得知:

单链表的每一个节点里面有一个信息域(element)和一个指向下一个节点的指针(next)。

查找一个节点是从第一个节点(head)找起。

那先创建节点的类吧:

class Node {
  constructor (element) { //传入数据
    this.element = element;
    this.next = null; //next是指向下一个节点的指针。
  }
}

接着创建单链表的类:

class SingleLinkedList {
  constructor () {
    this.head = null; // head指向第一个节点的指针。
    this.length = 0;
  }
}

给单链表增加一些方法(以下的方法都是写在单链表类里面的)

Append (加入一个节点)

/**
   * @param element 一个数据,可以是任何的数据类型.
   */
append (element) {
    let node = new Node(element), // 实例化一个节点。
        current;                 

    if (!this.head) {             // 如果为空则为空链表
      this.head = node;           // 链表头(head)指向第一个节点node。
    } else { // 不是空链表
      current = this.head;       // current也指向了第一个节点(用来从头部开始进行操作,且为了不改变head的指向)
      while (current.next) {     // 循环,直到某个节点的next为null
        current = current.next;  // 如果当前节点(current)的next不为null,那么current.next这个指针就给了current。
      }
      current.next = node;       //current.next为null退出循环(即已到了最后一个节点),那么它的next为node
    }
    this.length++;               //加入节点后,要把单链表长度加一。
    console.log("Append successfully");
}

InsertNode(在某位置加入一个节点)

/**
   * @param element 一个数据,可以是任何的数据类型.
   * @param {Number} position 要插入的某个位置. 
   */
  insertNode (element, position) {
    if (position >= 0 && position <= this.length) { // 判断插入的位置。
      let node = new Node(element),
        current = this.head,          // current是指向第一个借点咯。
        previous,                     // 指向前一个节点的指针。
        index = 0;

      if (position === 0) {
        node.next = current;         //此时head的指向的节点,变为了node指向的节点
        this.head = node;            // 而head当然指向node咯
      } else {
        while (index++ < position) { // index是否是要插入的位置,不是就+1。
          previous = current;        // 不是当前位置,那么current这个指针就交给previous。
          current = current.next;    // 这个跟append方法一样的。
        }                            // 是当前位置啦,就退出循环。
        previous.next = node;        // 前一个节点的next指向node(插入的节点)
        node.next = current;         // node.next就是current啦。
      }
      this.length++;
      console.log("Insert successfully");
    } else {
      throw new Error("这个单链表中不能从这个位置加入节点");
    }
  }

RemoveNode (删除一个节点)

/** 
   * @param {Number} position 要删除节点的位置
   */
  removeNode (position) {
    if (position > -1 && position < this.length) { //判断是否存在这position。
      let current = this.head,         // 同上面一样,用current来循环。
        previous,
        index = 0;

      if (position === 0) {
        this.head = current.next;     //head变为指向下一个节点。
      } else {
        while (index++ < position) {  //判断是否为当前的位置。
          previous = current;         // current就变为前一个节点 (指针变化)。
          current = current.next;     
        }                             // 确定要删除节点的位置,退出循环。
        previous.next = current.next; // 当前节点为current,那么移除它,这时前一个的节点就和后一个节点连在一起咯。
      }
      this.length--;                  // 长度减一。
      console.log("Remove successfully");
    } else {
      throw new Error("单链表没这个节点哦。");
    }
}

Print (输出单链表的每个节点)

print () {
    let arr = [this.head];  // 我用了数组包住了每个节点。
    let node = this.head;
    while (node.next) {     // 下一个节点是否存在。
      node = node.next;
      arr.push(node);
    }
    arr.map( (x, index) => {
      console.log(`第${index + 1}个节点是:`);
      console.log(x);
    });
}

运行结果:

个人源码地址

单链表就写到这里咯,接下来还会写其他的数据结构(本人也在学习当中)。第一次写文章,有错漏之处,希望指出。代码也有可以精简的地方,不过这样我觉让人看得明白些(大神轻喷)。不过也总算踏出了写文章的第一步,还是很开心的。^_^

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90157.html

相关文章

  • [个人心得]数据结构双链

    摘要:一般我们都构造双向循环链表。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。单向循环链表双向循环链表单向循环链表是在单链表基础上,将最后一个节点的指针指向链表头。 维基百科 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构...

    jokester 评论0 收藏0
  • [个人心得]数据结构栈,队列。

    摘要:另外栈也可以用一维数组或连结串列的形式来完成。压栈就是,出栈就是。出栈成功第个节点是这是单链表形式的栈的源码地址。队列只允许在后端称为进行插入操作,在前端称为进行删除操作。 维基百科 堆栈(英语:stack)又称为栈,是计算机科学中一种特殊的串列形式的抽象资料型别,其特殊之处在于只能允许在链接串列或阵列的一端(称为堆叠顶端指标,英语:top)进行加入数据(英语:push)和输出数据...

    curried 评论0 收藏0
  • 实战PHP数据结构基础单链

    摘要:常见操作对单链表我们常见的操作有如下语言实现首先我们根据定义实现一个类。单链表是链表这种链式存取数据结构中基础的部分,同样属于链表结构的还有双链表,环形链表和多链表。专题系列基础数据结构专题系列目录地址主要使用语法总结基础的数据结构和算法。 什么是链表? 链表由一个一个的作为节点的对象构成的,每一个节点都有指向下一个节点的指针,最后一个节点的指针域指向空。每个节点可以存储任何数据类型。...

    xumenger 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<