일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- HTML
- 호키스
- 개발
- 계명대
- hokeys
- SWIFT
- react
- 개발자
- 리액트 예제
- 자바스크립트 자료구조
- jest
- 호키도키
- 이종호
- 자료구조
- Svelte
- 자바스크립트
- 계명대 이종호
- queue
- javascript
- 리액트
- data structure
- TDD
- Hitit
- hokidoki
- 스벨트
- 비동기
- 자스민
- IOS
- 힛잇
- 스위프트
Archives
- Today
- Total
Dog foot print
[javascript] 이중연결리스트 본문
자바스크립트 이외에 언어에서 연결리스트가 가지는 이점은 배열처럼 고정된 크기를 가지는게 아니라 동적으로 크기를 조정 할 수 있는 것이 장점이다. 그렇다면 단순연결리스트와 원형연결리스트 보다 이중연결리스트가 가지는 이점은 무엇일까 ?
이중연결리스트란 ?
기존에 만들었던 연결리스트들은 모두 한 방향으로 이루어져 있다. 그런데 이중연결리스트는 L link 와 R link를 가지고 있어 해당 노드에서 전, 후 노드에 접근 하는 것이 가능케 된다. 이로인해서 헤드가 마지막에 연결되어있는 노드를 O(1) 의 복잡도를 가지고 찾을 수 있다.
멤버변수
class nodeType{
constructor(item){
this.data = item;
this.lLink = null;
this.rLink = null;
}
이중연결리스트의 메서드
처음 head 에 아무 것도 없을때는 새로운 노드를 head와 연결 시켜 주기만 하면 된다.
또한 insertLastNode와 deleteLastNode에서 큰 변화가 있는데 마지막 노드를 찾기 위해 반복문으로 p 변수를 옮겼던 것이 없어지고 head의 rLink를 통하여 마지막 노드를 빠르게 찾을 수 있다.
insertFirstNode(item){
let newNode = new nodeType(item);
if(this.rLink == null || this.lLink == null){
this.rLink = newNode;
this.lLink = newNode;
newNode.rLink = this;
newNode.lLink = this;
}else{
newNode.rLink = this.rLink;
newNode.lLink = this;
this.rLink.lLink = newNode;
this.rLink = newNode;
}
}
deleteFirstNode(){
if(this.link == null) return null;
this.rLink = this.rLink.rLink;
this.rLink.lLink = this;
}
insertLastNode(item){
let newNode = new nodeType(item);
if(this.lLink == null){
this.lLink = newNode;
newNode.rLink = this;
newNode.lLink = this;
this.rLink = newNode;
}else{
this.lLink.rLink = newNode;
newNode.lLink = this.lLink;
newNode.rLink = this;
this.lLink = newNode;
}
}
deleteLastNode(){
if(this.lLink == null) return null;
this.lLink = this.lLink.lLink;
this.lLink.lLink = this;
}
print(){
let string = `${this.data} | `;
// for(let p = this.link; p != this; p=p.link){
// }
let p = this.rLink;
while(p != this){
string += `${p.data} | `;
p= p.rLink;
}
string += p.data;
console.log(string)
}
전체
//linked list
class nodeType{
constructor(item){
this.data = item;
this.lLink = null;
this.rLink = null;
}
insertFirstNode(item){
let newNode = new nodeType(item);
if(this.rLink == null || this.lLink == null){
this.rLink = newNode;
this.lLink = newNode;
newNode.rLink = this;
newNode.lLink = this;
}else{
newNode.rLink = this.rLink;
newNode.lLink = this;
this.rLink.lLink = newNode;
this.rLink = newNode;
}
}
deleteFirstNode(){
if(this.link == null) return null;
this.rLink = this.rLink.rLink;
this.rLink.lLink = this;
}
insertLastNode(item){
let newNode = new nodeType(item);
if(this.lLink == null){
this.lLink = newNode;
newNode.rLink = this;
newNode.lLink = this;
this.rLink = newNode;
}else{
this.lLink.rLink = newNode;
newNode.lLink = this.lLink;
newNode.rLink = this;
this.lLink = newNode;
}
}
deleteLastNode(){
if(this.lLink == null) return null;
this.lLink = this.lLink.lLink;
this.lLink.lLink = this;
}
print(){
let string = `${this.data} | `;
// for(let p = this.link; p != this; p=p.link){
// }
let p = this.rLink;
while(p != this){
string += `${p.data} | `;
p= p.rLink;
}
string += p.data;
console.log(string)
}
}
let circleList = new nodeType("head");
circleList.insertFirstNode("1"); // head | 1 | head
circleList.insertFirstNode("2"); // head | 1 | 2 | head
circleList.insertFirstNode("3"); // head | 1 | 2 | 3 head
circleList.insertLastNode("4"); // head | 1 | 2 | 3 | 4 head
circleList.insertLastNode("5"); // head | 1 | 2 | 3 | 4 | 5 | head
circleList.insertLastNode("6"); // head | 1 | 2 | 3 | 4 | 5 | 6 |head
circleList.print();
// 혹시라도 거꾸로 출력하는 print메서드를 만들고 싶으면rLink 를 lLink 로 바꾸면 된다.
반응형
'Javascript' 카테고리의 다른 글
[javascript] Merge Sort ! (0) | 2019.07.29 |
---|---|
[javascript] Quick sort ! (0) | 2019.07.28 |
[javascript] 원형연결리스트 만들기 (0) | 2019.07.25 |
[javaScript] 추억의 javascript로 달력 만들기(2) (0) | 2019.07.25 |
[javascript] 추억의 javascript로 달력 만들기 (1) (10) | 2019.07.24 |
Comments