class LinkedList {
constructor() {
//内部的类:节点类
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
//属性
this.head = null;
this.length = 0;
//链表的长度不包括头节点head,head指向的第一个节点的下标是0
// 1.append(element)方法:在链表末尾添加新元素
LinkedList.prototype.append = function (data) {
// 创建一个新节点
var newNode = new Node(data);
//存放head的指向值
var current = this.head;
//判断添加的是否是第一个节点
if (this.length == 0) {
this.head = newNode
}
else {
// 从头开始查找直到链表末尾
while (current.next) {
current = current.next
}
current.next = newNode
}
this.length += 1
}
// 2.toString()方法:将链表中的data转换成字符串形式
LinkedList.prototype.toString = function () {
//存放head的指向值
var current = this.head;
var listString = ""
//循环获取一个个节点
while (current) {
listString += current.data + " ";
current = current.next
}
return listString
}
// 3.insert(position,element)方法:在指定位置插入元素
LinkedList.prototype.insert = function (position, data) {
// 创建一个新节点
var newNode = new Node(data);
//存放head的指向值
var current = this.head;
// 创建一个当前节点的上一个节点
var previous = null;
// 首先对position进行越界判断
if (position < 0 || position > this.length) {
return false;
}
if (position == 0) {
// head实际上是一个指针,指向第一个节点,相当于newNode取代了head
newNode.next = this.head;
this.head = newNode;
} else {
for (var i = 0; i < position; i++) {
// 插入位置的前一个节点
previous = current;
// 插入位置的后一个节点
current = current.next
}
newNode.next = current;
previous.next = newNode
}
this.length += 1;
return true
}
// 4.get(position)方法:获取元素
LinkedList.prototype.get = function (position) {
//存放head的指向值
var current = this.head;
// 首先进行越界判断
if (position < 0 || position >= this.length) {
return false;
}
//循环寻找到对应位置的元素
for (var i = 0; i < position; i++) {
current = current.next
}
return current.data
}
// 5.indexOf(element)方法:返回元素对应的索引值,如果找不到就返回-1
LinkedList.prototype.indexOf = function (data) {
//存放head的指向值
var current = this.head;
var index = 0;
while (current) {
if (current.data == data) {
return index;
}
index++;
current = current.next
}
return -1;
}
// 6.update(position,element)方法:将position位置的元素修改成element
LinkedList.prototype.update = function (position, data) {
//存放head的指向值
var current = this.head;
if (position < 0 || position >= this.length) {
return false
}
for (var i = 0; i < position; i++) {
current = current.next;
}
current.data = data;
return true
}
// 7.removeAt(position)方法:删除指定位置的元素
LinkedList.prototype.removeAt = function (position) {
//存放head的指向值
var current = this.head;
// 创建一个当前节点的上一个节点
var previous = null;
if (position < 0 || position >= this.length) return false;
//判断删除的是否是第一个节点
if (position == 0) {
this.head = this.head.next;
}
else {
for (var i = 0; i < position; i++) {
previous = current;
current = current.next
}
// 上一个节点的指针也要改变
previous.next = current.next
}
this.length -= 1;
return true
}
// 8.remove(element)方法:从链表中删除element项
LinkedList.prototype.remove = function (data) {
var position = this.indexOf(data);
this.removeAt(position);
return true
}
}
}
单向链表结构以及其他常用方法的封装(JavaScript)
最新推荐文章于 2022-06-30 17:25:04 发布