remove element

steyu·2022년 11월 13일
0
let dummy = new Node(null) // reference
dummy.next = this.head;
let prev = dummy;

prev.next = current.next 

prev, dummy는 둘다 new Node의 reference로
prev.next가 바뀌면 new Node자체의 next가 바뀌는거이므로 dummy.next도 같이 바뀐다

문제: 주어진 링크드리스트에서 val와 같은 element들을 삭제하여라.

예제 : 1→3→5→7→3→1 , val = 3
답 : 1→5→7→

1. iterative remove

  removeEle_iterative(e) {
    if (!this.head) return null;
    let dummy = new Node(null);
    dummy.next = this.head;
    let prev = dummy;
    let curr = this.head;
    // prev.next = this.head;
    while (curr) {
      if (curr.value === e) {
        prev.next = curr.next;
        // curr = curr.next;
      } else {
        // curr = curr.next;
        prev = curr;
      }
      curr = curr.next;
    }
    return dummy.next;
  }
}```

2. recursive remove

currNode.value = 타겟일때 nextNode를 바로 리턴
아니면 currNode.next = nextNode로 연결해주고 currNode리턴

  removeEle_recursive(currNode, e) {
    if (!currNode) return null;
    let nextNode = this.removeEle_recursive(currNode.next, e);
    if (currNode.value === e) {
      return nextNode;
    } else {
      currNode.next = nextNode;
      return currNode;
    }
  }```

전체 코드

class Node {
constructor(value) {
  this.value = value;
  this.next = null;
}
}

function printNodes(node) {
let curr = node;
while (curr) {
  console.log(curr.value);
  curr = curr.next;
}
}

class LinkedList {
constructor() {
  this.head = null;
}

addNode(value) {
  const newNode = new Node(value);
  if (!this.head) {
    this.head = newNode;
  } else {
    let curr = this.head;

    while (curr.next) {
      curr = curr.next;
    }
    curr.next = newNode;
  }
}

removeEle_iterative(e) {
  if (!this.head) return null;
  let dummy = new Node(null);
  dummy.next = this.head;
  let prev = dummy;
  let curr = this.head;

  // prev.next = this.head;

  while (curr) {
    if (curr.value === e) {
      prev.next = curr.next;
      // curr = curr.next;
    } else {
      // curr = curr.next;
      prev = curr;
    }
    curr = curr.next;
  }
  return dummy.next;
}

// 타겟일때 nextNode를 바로 리턴
// 타겟이 아니면 currNode.next = nextNode로 연결해주고 currNode리턴
removeEle_recursive(currNode, e) {
  if (!currNode) return null;
  let nextNode = this.removeEle_recursive(currNode.next, e);
  if (currNode.value === e) {
    return nextNode;
  } else {
    currNode.next = nextNode;
    return currNode;
  }
}
}

const linkedList = new LinkedList();
linkedList.addNode(3);
linkedList.addNode(1);
linkedList.addNode(3);
linkedList.addNode(5);
linkedList.addNode(7);
linkedList.addNode(3);
linkedList.addNode(1);
console.log(linkedList);
printNodes(linkedList.removeEle_iterative(3)); // 1571
printNodes(linkedList.removeEle_recursive(linkedList.head, 1)); // 33573

0개의 댓글

관련 채용 정보