obcon-scada / app /include /LinkedList.js
chanmin0723's picture
Initial obcon SCADA deploy
e4bf523
Raw
History Blame Contribute Delete
4.49 kB
'use strict'
/**
* Copyright (c) 2017~2019, OBCon Inc.
* All rights reserved.
*/
/**
* @file
* @copyright 2017~2019, OBCon Inc.
* @author gye hyun james kim [pnuskgh@gmail.com]
*/
class Node {
constructor(data) {
this.prev = null;
this.data = data;
this.next = null;
}
}
class LinkedList {
constructor(isSingle=true) {
this.size = 0;
this.head = null;
this.tail = null;
this.isSingle = isSingle;
}
isEmpty() {
return this.size == 0;
}
insert(item) {
if (this.isSingle) {
this._insert_single(item);
} else {
this._insert_double(item);
}
}
_insert_single(item) { //--- Head에 데이터를 추가 한다.
if (this.head == null) {
this.head = new Node(item);
} else {
let tmp = this.head;
this.head = new Node(item);
this.head.next = tmp;
}
this.size = this.size + 1;
}
_insert_double(item) { //--- Head에 데이터를 추가 한다.
if (this.head == null) {
this.head = new Node(item);
this.tail = this.head;
} else {
let tmp = this.head;
this.head = new Node(item);
this.head.next = tmp;
tmp.prev = this.head;
}
this.size = this.size + 1;
}
insertAtTail() {
if (this.tail == null) {
this.tail = new Node(item);
this.head = this.tail;
} else {
let tmp = this.tail;
this.tail = new Node(item);
this.tail.prev = tmp;
tmp.next = this.tail;
}
this.size = this.size + 1;
}
remove(item) {
if (this.isSingle) {
this._remove_single(item);
} else {
this._remove_double(item);
}
}
_remove_single(item) { //--- 값으로 데이터를 삭제 한다.
let nodePrev = null;
let nodeCurrent = this.head;
for (let idx = 0; idx < this.size; idx++) {
if (nodeCurrent.data == item) {
if (idx == 0) {
this.head = nodeCurrent.next;
} else {
nodePrev.next = nodeCurrent.next;
}
this.size = this.size - 1;
break;
}
nodePrev = nodeCurrent;
nodeCurrent = nodeCurrent.next;
}
}
_remove_double(item) {
}
deleteAtHead() {
if (this.isSingle) {
return this._deleteAtHead_single();
} else {
return this._deleteAtHead_double();
}
}
_deleteAtHead_single() {
let rtval = null;
if (this.head != null) {
rtval = this.head.data;
this.head = this.head.next;
this.size = this.size - 1;
}
return rtval;
}
_deleteAtHead_double() {
let rtval = null;
if (this.head != null) {
rtval = this.head.data;
if (this.head == this.tail) {
this.head = null;
this.tail = null;
} else {
this.head = this.head.next;
this.head.prev = null;
}
this.size = this.size - 1;
}
return rtval;
}
deleteAtTail() {
let rtval = null;
if (this.tail != null) {
rtval = this.head.data;
if (this.head == this.tail) {
this.head = null;
this.tail = null;
} else {
this.tail = this.tail.prev;
this.tail.next = null;
}
this.size = this.size - 1;
}
return rtval;
}
find(item) {
let rtFlag = false;
let nodeCurrent = this.head;
for (let idx = 0; idx < this.size; idx++) {
if (nodeCurrent.data == item) {
rtFlag = true;
break;
}
nodeCurrent = nodeCurrent.next;
}
return rtFlag;
}
}
module.exports = LinkedList;