绪论
链表是一种链式数据结构,每个节点包含两种信息:本身数据和下一节点指针。
链表的方法:
- size:节点个数。
- head:获取头部元素。
- add:链表尾部增加一个节点。
- remove:删除某个节点。
- indexOf:获取某个节点的index。
- elementAt:获取index处的节点。
- addAt:在index处插入一个节点。
- removeAt:删除index处的节点。
正文
<!DOCTYPE html>
<div lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>index</title>
<script src="js/jquery-2.2.4.min.js"></script>
<style>
</style>
</head>
<body>
</body>
<script>
$(document).ready(function () {
var linked = new myLinked();
linked.show();
linked.add('aaa');
linked.add('bbb');
linked.add('ccc');
linked.show();
console.log('size长度:' + linked.size());
console.log('头部节点:' + linked.head().value);
linked.addAt(2, 'ddd');
linked.show();
console.log('移除节点:' + linked.remove('bbb'));
linked.show();
console.log('移除2节点:' + linked.removeAt(2));
linked.show();
});
// 节点
function Node(v) {
// 值
this.value = v;
// 下一节点
this.next = null;
}
// 链表
function myLinked() {
// 长度
var length = 0;
// 链表头部
var linkedHead = null;
// 获取节点个数
this.size = function() {
return length;
};
// 获取头部节点
this.head = function() {
return linkedHead;
};
// 链表尾部增加一个节点
this.add = function(v) {
var node = new Node(v);
// 如果链表没数据
if (linkedHead == null)
linkedHead = node;
else {
var endNode = linkedHead;
// 循环,找到最后一个节点
while(endNode.next) {
endNode = endNode.next;
}
endNode.next = node;
}
// 长度加一
length++;
};
// 根据值删除某个节点
this.remove = function(v) {
// 链表为空,直接结束
if (length === 0) {
return false;
}
var endNode = linkedHead;
// 临时变量
var temNode;
if (endNode.value === v) {
// 如果头部就是想要移除的节点
linkedHead = endNode.next;
length--;
} else {
/**
* 1、当没有符合条件的节点时,temNode.next = null
* 2、当有符合条件的节点时,temNode.next = endNode.next,去掉endNode节点
*/
while(endNode.value !== v) {
temNode = endNode;
endNode = endNode.next;
// 当找到符合条件的节点,长度才减少
if (endNode.value === v) {
length--;
}
}
temNode.next = endNode.next;
}
return true;
};
// 是否为空
this.isEmpty = function() {
return length === 0;
};
// 获取某个节点的index
this.indexOf = function(v) {
var index = -1;
var endNode = linkedHead;
while(endNode) {
index++;
if (endNode.value === v) {
return index;
}
endNode = endNode.next;
}
return -1;
};
// 获取index处的节点
this.elementAt = function(index) {
// 当index小于0或者大于存在节点个数
if (index < 0 || index >= length) {
return null;
}
var endNode = linkedHead;
var count = 0;
while(count < index) {
count++;
endNode = endNode.next;
}
return endNode.value;
};
// 在index处插入一个节点
this.addAt = function(index, v) {
// 当index小于0或者大于存在节点个数
if (index < 0 || index >= length) {
return false;
}
var node = new Node(v);
var endNode = linkedHead;
// 临时变量
var temNode;
var temIndex = 0;
if (index === 0) {
node.next = endNode;
linkedHead = node;
} else {
while(temIndex < index) {
temIndex++;
temNode = endNode;
endNode = endNode.next;
}
node.next = endNode;
temNode.next = node;
}
length++;
return true;
};
// 删除index处的节点
this.removeAt = function(index) {
// 当index小于0或者大于存在节点个数
if (index < 0 || index >= length) {
return null;
}
var endNode = linkedHead;
if (index === 0) {
linkedHead = endNode.next;
} else {
var temIndex = 0;
var temNode;
while(temIndex < index) {
temIndex++;
temNode = endNode;
endNode = endNode.next;
}
temNode.next = endNode.next;
}
length--;
return endNode.value;
};
// 展示
this.show = function() {
console.log('长度:' + length);
var endNode = linkedHead;
while(endNode) {
console.log('链表值:' + endNode.value);
endNode = endNode.next;
}
};
}
</script>
</div>
结果
(若有什么错误,请留言指正,3Q)