很久沒有接觸數據結構和算法了,可是這些在面試中仍是須要的因此打算從新複習下 今天打算用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面試