资源经验分享链表

链表

2020-01-03 | |  130 |   0

原标题:链表

原文来自:CSDN      原文链接:hhttps://blog.csdn.net/abei0518/article/details/103798878


链表

链表是一种物理上非连续、非顺序的存储结构,数据元素之间的顺序是通过每个元素的指针关联的。

链表有一系列节点组成,每个节点一般至少会包含两部分的信息:(1)元素数据 (2)指向下一个元素的指针

链表分类: (1)单向链表和双向链表  (2)静态链表(数组实现) 、动态链表(指针)

链表的操作: 创建、插入、删除、输出

链表的特点:

(1)物理空间不连续,空间开销更大

(2)在运行时可以动态添加

(3)查找元素需要顺序查找

动态链表的实现代码如下:

	     class Node {
			  constructor(data) {
			  //数据
			    this.data = data;
			    //指向
			    this.next = null;
	 		 }
		}
		
		class LinkedList {
		  constructor() {
		    this.head = null;
		    this.tail = null;
		    this.length = 0;
		  }
		  
	  // 添加
	  append(data) {
	    // 先把内容传到node这个类里面赋值  最后拿到的结果是一个对象{data:data,next:null}
	    let node = new Node(data);
	    // 判断head是否是第一次添加  如果是的话直接赋值  
	    if (!this.head) {
	      this.head = node;
	      this.tail = node
	    } else {
	      // 如果不是  要改变指向next
	      this.tail.next = node
	      this.tail = node
	    }
	    // 每加一次让length  +1
	    this.length += 1;
	    return this;
	  }
	  
	  // 按位置删除
	  remove(position) {
	    let current = this.head
	    let index = 0;
	    let prev = null;
	    // 如果位置不存在
	    let message = '该数据不存在'
	    if (position < 0 || position > this.length - 1) {
	      return message;
	    }
	    // 如果删除的是第一个
	    if (position === 0) {
	      // 如果是第一个的话就让head的指向等于head的下一个指向
	      this.head = this.head.next
	    } else {
	      // 如果不是第一个  把上一个的指向指向要删除的那一项的下一个 也就是跳过被删除的这一项
	      while (index++ < position) {
	        // 保存上一个到prev
	        prev = current
	        // 保存被删除项
	        current = current.next
	      }
	      // 被删除的上一个元素的指向=被删除项的指向
	      prev.next = current.next
	      // 如果删除的是最后一项
	      if (position === this.length - 1) {
	        this.tail = prev
	      }
	    }
	    this.length -= 1;
	    return current.data;
	  }
	  
	  // 修改
	  updata(position, newdata) {
	    let message = '该数据不存在'
	    if (position < 0 || position > this.length - 1) {
	      return message;
	    }
	    let current = this.head;
	    let index = 0;
	    // 找到当前要修改的元素
	    while (index++ < position) {
	      current = current.next
	    }
	    // 修改内容
	    current.data = newdata
	    return this;
	  }
	  
	  // 查找
	  get(position) {
	    let message = '该数据不存在'
	    if (position < 0 || position > this.length - 1) {
	      return message;
	    }
	    let current = this.head;
	    let index = 0;
	    // 找到当前的元素
	    while (index++ < position) {
	      current = current.next
	    }
	    return current.data;
	  }
	  
	  // 插入
	  insert(position, data) {
	    let node = new Node(data)
	    let index = 0;
	    let prev = null;
	    let current = this.head;
	    // 判断是否是添加到第一个
	    if (position === 0) {
	      // 新元素的指向=原本第一个元素
	      node.next = this.head
	      this.head = node
	    } else {
	      while (index++ < position) {
	        // 保存上一个元素
	        prev = current
	        // 保存当前元素
	        current = current.next
	      }
	      // 上一个元素的指向=新添加的元素
	      prev.next = node
	      // 新添加的元素的指向=当前元素
	      node.next = current
	    }
	    // 如果插入的位置是最后的一个
	    if (position === this.length) {
	      this.tail = node
	    }
	    this.length += 1;
	    return this;
	  }
	  // 转数组
	  toArray() {
	    let arr = [];
	    let current = this.head
	    while (current) {
	      arr.push(current.data)
	      current = current.next
	    }
	    return arr;
	  }
	  // 转字符串
	  toString() {
	    let str = '';
	    let current = this.head
	    while (current) {
	      str += current.data + ' '
	      current = current.next
	    }
	    return str;
	  }
	  // 长度
	  size() {
	    return this.length
	  }
	  // 判断是否为空
	  isEmpty() {
	    return this.length === 0
	  }
	}

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:牛顿迭代法

下一篇:自动驾驶(六十二)---------导航路径规划

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...