使用js对链表数据结构的实现

使用JS对链表数据结构的实现

  • 看数据结构的书大多对各种数据结构算法的实现都是使用c,所以自己用JS写了一个,也可以加深对数据结构的理解

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}
class List {
  constructor() {
    this.head = new Node('head');

  };
  //往头部插入
  prevInsert(data) {
    var newNode = new Node(data);
    newNode.next = this.head.next;
    this.head.next = newNode;
  };
  //查询链表,显示链表中对index个元素,如果不传则会展示整个链表
  show(index) {
    if (index) {
      var currNode = this.head;
      for (let i = 0; i < index; i++) {
        var nextNode = currNode.next;
        currNode = nextNode;
      }
      console.log(currNode)
    } else {
      var currNode = this.head;
      var nextNode;
      while (currNode.next) {
        nextNode = currNode.next;
        currNode = nextNode;
        console.log(currNode)
      }
    }
  };
  //往尾部插入
  nextInsert(data) {
    var currNode = this.head;
    var nextNode;
    while (currNode.next) {
      nextNode = currNode.next;
      currNode = nextNode;
    }
    if (!currNode.next) {
      currNode.next = new Node(data)
    }
  };
  //查询函数,如果传入数字就查找索引,传入内容就查找内容
  find(index) {
    var currNode = this.head;
    var nextNode;
    var flag = 1;
    if (typeof(index) === 'number' && index > 0) {
      //如果是数字的话
      while (1) {
        nextNode = currNode.next;
        currNode = nextNode;
        if (flag == index) {
          console.log(currNode);
          return;
        }
        if (!currNode.next) {
          console.log('索引大于链表长度');
          return;
        }
        flag++;
      }
    } else {
      //传入参数不是数字,则解析为内容
      while (1) {
        nextNode = currNode.next;
        currNode = nextNode;
        if (currNode.data == index) {
          console.log(currNode);
          return;
        }
        if (!currNode.next) {
          console.log('查找内容不在链表中');
          return;
        }
      }
    }
  };
  //插入到指定位置
  indexInsert(index, data) {
    var currNode = this.head;
    var nextNode;
    var flag = 0;
    while (1) {
      nextNode = currNode.next;
      currNode = nextNode;
      if (flag == index - 1) {
        var newNode = new Node(data);
        newNode.next = currNode.next
        currNode.next = newNode;
        return;
      }
      flag++
    }
  };
  //删除指定位置,或删除指定内容
  delete(index) {
    var prevNode;
    var currNode = this.head;
    var nextNode;
    var flag = 1;
    if (typeof(index) === 'number') {
      while (1) {
        prevNode = currNode;
        nextNode = currNode.next;
        currNode = nextNode;
        if (flag === index) {
          prevNode.next = currNode.next
          return;
        }
        if (!currNode.next) {
          console.log('索引超出链表长度');
          return;
        }
        flag++
      }
    } else {
      while (1) {
        prevNode = currNode;
        nextNode = currNode.next;
        currNode = nextNode;
        if (currNode.data === index) {
          prevNode.next = currNode.next
          return;
        }
        if (!currNode.next) {
          console.log('链表没有此元素');
          return;
        }
      }
    }
  };
}
var list = new List();
list.nextInsert('fir');
list.nextInsert('sec');
list.nextInsert('thr');
list.nextInsert('four');
list.delete('thr')
list.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值