class Node {
  constructor (data, next = null) {
    this.data = data
    this.next = next
  }
}

class SinglyCircularLinkedList {
  constructor () {
    this.head = null
    this.size = 0
  }

  insert (data) {
    const node = new Node(data)

    if (!this.head) {
      node.next = node
      this.head = node
      this.size++
    } else {
      node.next = this.head

      let current = this.head

      while (current.next.data !== this.head.data) {
        current = current.next
      }

      current.next = node
      this.size++
    }
  }

  insertAt (index, data) {
    const node = new Node(data)

    if (index < 0 || index > this.size) return

    if (index === 0) {
      this.head = node
      this.size = 1
      return
    }

    let previous
    let count = 0
    let current = this.head

    while (count < index) {
      previous = current
      current = current.next
      count++
    }

    node.next = current
    previous.next = node
    this.size++
  }

  remove () {
    if (!this.head) return

    let prev
    let current = this.head

    while (current.next !== this.head) {
      prev = current
      current = current.next
    }

    prev.next = this.head
    this.size--
  }

  printData () {
    let count = 0
    let current = this.head

    while (current !== null && count !== this.size) {
      console.log(current.data + '\n')
      current = current.next
      count++
    }
  }
}

const ll = new SinglyCircularLinkedList()

ll.insert(10)
ll.insert(20)
ll.insert(30)
ll.insert(40)
ll.insert(50)
ll.insertAt(5, 60)
ll.remove(5)
ll.printData()

SingleCircularLinkedList