Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
먼저 내가 그린 그림
좀 더 나은 그림으로...
[그림 출처: https://codeburst.io/linked-lists-in-javascript-es6-code-part-1-6dd349c3dcc3]
Property of Linked List
Method of Linked List
Pesuedo Code 짜보기
list라는 객체를 선언한다. head와 tail은 null을, length는 0을 값으로 하는 속성값을 할당한다.
list에 들어갈 Node를 만들 생성자 함수가 필요하다.
addEnd: 노드는 위치와 상관없이 추가가 가능하지만 일단 수도코드는 끝에 추가하는 것만 짜본다.
removeEnd: 추가와 동일하게 끝 부분 삭제만 구현해본다.
1) list의 length가 0인 경우 제거는 불가능하다.
2) list의 legnth가 1인 경우 head와 tail의 값을 null로 재할당하고 length의 값도 0으로 재할당 한다.
3) list의 length가 2 이상인 경우,
search:
1) list의 length가 1보다 작으면 null을 리턴한다.
2) list의 length가 1보다 같거나 크면,
3) 순회가 끝나도 동일 값을 찾지 못하면 null을 리턴한다.
Linked List 관련 읽어보기
const LinkedList = function() {
const list = {};
list.head = null;
list.tail = null;
};
//
list.addToTail = function(value) {
const node = new Node(value);
if (this.head === null) {
this.head = node;
} else {
this.tail.next = node;
}
this.tail = node;
};
//
list.removeHead = function() {
if(this.head === null) {
return null;
}
list.head = list.head.next;
if(this.head === null) {
this.tail = null;
}
return this.head;
};
//
list.contains = function(target) {
const originalHead = this.head;
let node = this.head;
while (node !== null) {
if (node.value === target) {
return true;
}
node = node.next;
}
this.head = originalHead;
return false;
};
//
const Node = function(value) {
const node = {};
node.value = value;
node.next = null;
return node;
};
먼저 내가 그린 그림
좀 더 나은 그림으로...
[그림 출처: https://medium.com/@ziyoshams/graphs-in-javascript-cc0ed170b156]
Property of Graph
Method of Graph
Pseudoclassical Implementation
const Graph = function() {
this.nodes = {};
}
Graph.prototype.addNode = function(node) {
this.nodes[node] = this.nodes[node] || {edges: {} };
};
Graph.prototype.cotains = function(node) {
return !!this.nodes[node];
}
Graph.prototype.removeNode = function(node) {
if(this.contains(node)) {
const keys= Object.keys(this.nodes[node].edges);
for(let i = 0; i < keys.length; i++;) {
this.removeEdge(node, keys[i]);
}
delete this.nodes[node];
}
};
Graph.prototype.hasEdge = function(fromNode, toNode) {
if(!this.contains(fromNode)) {
return false;
}
return !!this.nodes[fromNode].edges[toNode];
};
Graph.prototype.addEdge = function(fromNode, toNode) {
if(!this.contains(fromNode) || !this.contains(toNode)) {
return;
}
this.nodes[fromNode].edges[toNode] = toNode;
this.nodes[toNode].edges[fromNode] = fromNode;
};
Graph.prototype.removeEdge = functino(fromNode, toNode) {
if(!this.contains(fromNode) || !this.contains(toNode)) {
return;
}
delete this.nodes[fromNode].edges[toNode];
delete this.nodes[toNode].edges[fromNode];
};
Graph.prototype.forEachNode = function(callback) {
const keys = Object.keys(this.nodes);
for(let i = 0; i < keys.length; i++) {
callback(keys[i]);
}
};
tree 구조는 익숙하다. 보통 이렇게 생김.
[그림 출처: https://chercher.tech/kotlin/tree-kotlin]
const Tree = function(value) {
this.value = value;
this.children = [];
}
Tree.prototype.addChild = function(value) {
const child = Tree(value);
this.children.push(child);
}
Tree.prototype.contains = function(target) {
if(this.value === target) {
return true;
}
for(let i = 0; i < this.children.length; i++) {
const child = this.children[i];
if(child.contains(target)) {
return true;
}
}
return false;
}
Tree.prototype.traverse = functoin(callback) {
callback(this.value);
if(!this.children) {
return;
}
for(let i = 0; i < this.children.length; i++) {
const child = this.children[i];
child.traverse(callback);
}
});
Tree.prototype.map = funcion(callback) {
const newTree = new Tree();
newTree.value = callback(this.value);
function recursion(children, tree) {
if(children.length) {
for(let i = 0; i < children.length; i++) {
const child = chilren[i]
const newChild = new Tree(callback(child.value));
tree.addChild(newChild);
recursion(child.children, newChild);
}
}
}
recursion(this.children, newTree);
return newTree;
};