很久没有接触数据结构和算法了,可是这些在面试中仍是须要的因此打算从新复习下 今天打算用js来实现循环链表,看下别人怎么实现,发现不多使用js实现的,并且实现有点问题在对head节点进行删除或者插入修改引用有问题,因此打算本身来实现下加深印象。
下面是实现的主要代码:node
function CirLinkList() {
function Node(element) {
this.element = element;
this.next = null;
}
var length = 0;
var head = null, tail = null;
this.append = function(element) {
var node = new Node(element), current;
if (!head) {
head = node;
head.next = head;
tail = head;
} else {
current = head;
while (current.next !== head) {
current = current.next;
}
current.next = node;
tail = node;
node.next = head;
}
length++;
return true;
}
this.insert = function(position,element) {
var node = new Node(element), current;
if (position > -1 && position < length) {
var index = 0,
current = head;
if (position === 0) {
node.next = head;
tail.next = node;
head = node;
} else {
while (index++ < position) {
current = current.next;
}
node.next = current.next;
current.next = node;
}
length++;
return true
} else {
return false;
}
}
this.remove = function(element) {
if (element === head.element) {
if (length === 1) {
head = null;
} else {
tail.next = head.next;
head = tail.next;
}
length--;
return true;
} else {
current = head;
while (current.next !== head) {
if (current.next.element === element) {
current.next = current.next.next;
if (current.next === head) tail = current;
length--;
return true;
}
current = current.next;
}
}
return false;
}
this.getHead = function() {
return head;
}
this.size = function() {
return length;
}
this.isEmpty = function() {
return head ? false : true;
}
}
let cirLink = new CirLinkList();
let i = 1;
cirLink.append(1);
cirLink.append(2);
cirLink.insert(0, 3);
cirLink.remove(3);
cirLink.insert(0, 0);
cirLink.append(3)
let current = cirLink.getHead();
while (current) {
console.log(current.element);
if (i === 6) break;
i++;
current = current.next;
}
复制代码
遍历结果0, 1, 2, 3, 0, 1面试