ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Section19 - 단일 연결 리스트
    자료구조 & 알고리즘 & CS + 2022. 7. 20. 23:37
    728x90
    반응형


    날라가서 다시씀

    분명 어제 저장했던 기억이 있는데, 기억만 남아버리고 파일은 날아가버렸넵

     

    [단일 연결 리스트]

     

    얼핏보면 배열과 같지만, 다른 점들이 짱짱많음

     

    [코드]

    // piece of data -val
    // reference to next node - next
    
    class Node {
      constructor(val){
        this.val = val;
        this.next = next;
      }
    }
    
    class SinglyLinkedList{
      constructor(){
        this.head = null;
        this.tail = null;
        this.length = 0;
      }
    
      push(val){
    
        const newNode = new Node(val);
    
        if(this.head === null){
          this.head = newNode;
          this.tail = this.head;
        } else {
          this.tail.next = newNode;
          this.tail = newNode;
        }
        this.length += 1;
        
        return this;
    
      }
    
      pop(){
    
        if(!this.head) return undefined;
    
        let current = this.head;
        let newTail = current;
    
        while(current.next){
    
          newTail = current;
          current = current.next;
    
        }
        this.tail = newTail;
        this.tail.next = null;
        this.length -= 1;
    
        if(this.length === 0){
          this.head = null;
          this.tail = null;
        }
    
        return current;
      }
    
      shift(){
    
        if(!this.head) return undefined;
    
        let currentHead = this.head;
        this.head = currentHead.next;
        // currentHead.next = null;
    
        this.length -= 1;
        
        if(this.length === 0){
          this.head = null;
          this.tail = null;
        }
    
        return currentHead;
        
      }
    
      unshift(val){
    
        const newNode = new Node(val);
    
        if(this.length === 0){
          this.head = newNode;
          // this.head.next = newNode;
          this.tail = newNode;
        } 
        // else {
    
        //   const currentHead = this.head;
    
        //   this.head = newNode;
        //   this.head.next = currentHead;
        // }
          else {
            newNode.next = this.head;
            this.head = newNode;
      }
    
        this.length += 1;
    
        return this;
    
      }
    
      get(idx){
    
        if(idx < 0) return null;
        if(idx >= this.length) return null;
    
        let counter = 0;
        let current = this.head;
    
        while(counter !== idx){
    
          current = current.next;
          counter++;
    
        }
    
        return current;
      }
    
      set(idx,val){
        
        let foundNode = this.get(idx);
        
        if(foundNode){
          foundNode.val = val;
          return true;
        }
    
        return false;
    
        // const newNode = new Node(val);
        // val값만 바꿔주면 되니까 새로운 노드 만들필요 x
      }
    
      insert(idx,val){
    
        if(idx < 0) return false;
        if(idx > this.length) return false;
    
        if(idx === this.length) { !!this.push(val); }
        if(idx === 0){ !!this.unshift(val); } 
        //형변환 시켜버림 성공했으니까 값이뜨고 그것의 반대의 반대가 바로 true    
    
        const newNode = new Node(val);
    
        let prev = this.get(idx-1);
        let temp = prev.next
        prev.next = newNode;
        newNode.next = temp;
    
        
        this.length +=1;
        return true
    
      }
    
      remove(idx,val){
    
        if(idx < 0) return false;
        if(idx >= this.length) return false;
    
        if(idx === 0){ !!this.shift(val); } 
        if(idx === this.length-1) { !!this.pop(val); }
    
        let prev = this.get(idx-1);
        let removed = prev.next;
        prev.next = removed.next;
        // removed.next = null;
        this.length -= 1;
        
        return true;
    
      }
    
      print(){
        const arr = [];
        let current = this.head;
        while(current){
          arr.push(current.val)
          current = current.next;
        }
        console.log(arr);
      }
    
      reverse(){
    
        let node = this.head;
        this.head = this.tail;
        this.tail = node;
    
        let next;
        let prev = null;
    
        for(let i=0; i<this.length; i++){
          next = node.next;
          node.next = prev;
          prev = node;
          node = next;
        }
        return this;
    
      }
    
    }

     

    [BigO]

     

    삽입 O(1)

    삭제 O(1) or O(N)

    검색 O(N)

    접근 O(N)

     

    [Recap]

     

    1.단일 연결 리스트들은 배열의 대안으로 삽입이나 삭제가 상대적으로 효율적임

    2.배열과 달리 idx가 없으며 다음으로 이어지는 포인터만 있을 뿐

    3.단일 연결 리스트로 이후의 나오는 스택, 큐 와 같은 자료 구조를 만들어 볼 수 있음

    반응형

    '자료구조 & 알고리즘 & CS +' 카테고리의 다른 글

    Section22 - 이진 검색 트리  (0) 2022.07.26
    Section21 - 스택 & 큐  (0) 2022.07.23
    Section20 - 이중 연결 리스트  (0) 2022.07.21
    Section18 - 자료 구조 소개  (0) 2022.07.18

    댓글

Designed by Tistory.