dsa.singlylinkedlist API documentation

# Module `dsa.singlylinkedlist`

Expand source code

    class Node:
        def __init__(self, value):
            self.value = value
            self.next = None

    class LinkedList:
        def __init__(self, head=None, tail=None, count=0):
            ''' initialize a doubly linked list
                accepts an optional head node, tail node and count
                if only the head node is specified, tail is set to the head node and count is automatically set to 0
                if both head and tail nodes are specified, count should be specified as well
            '''
            self.head = head
            if head is not None and tail is None:
                self.tail = head
                self.count = 1
            else:
                self.tail = tail
                self.count = count

        @classmethod
        def from_array(cls, mylist=None):
            ''' create a linked list from an array '''
            ll = cls()
            for value in mylist:
                ll.append(value)

            return ll

        def __repr__(self):
            s = ""
            current = self.head
            while current is not None:
                s += str(current.value) + " "
                current = current.next

            return f"[{s}] Count: {self.count}"

        def search(self, value):
            ''' return index of specified value '''
            i = 0
            current = self.head
            while current is not None:
                if current.value == value:
                    return i
                i += 1
                current = current.next
            raise Exception("Value not found")

        def insert(self, index, value):
            ''' insert value at a specified index '''
            i = 0

            # insert front
            if index == 0:
                new_node = Node(value)
                new_node.next = self.head
                self.head = new_node
                self.count += 1
                return

            current = self.head
            while index < i or current is not None:
                i += 1
                if i == index:
                    break
                current = current.next

            if index > i:
                raise Exception("Index Out of Bounds")
            new_node = Node(value)
            tmp = current.next
            current.next = new_node
            new_node.next = tmp
            self.count += 1

        def append(self, value):
            ''' append value to the end of the list '''

            if self.head is None:
                self.head = Node(value)
                if self.count == 0:
                    self.tail = self.head
                self.count += 1
                return

            # go to the end of the list
            new_node = Node(value)
            self.tail.next = new_node
            self.tail = new_node

            self.count += 1

        def delete(self, index):
            ''' delete node at a specified index '''
            if index == 0:
                if self.head is None:
                    raise Exception("LinkedList is Empty")
                self.head = self.head.next
                self.count -= 1
                return

            i = 0
            current = self.head
            prev = current
            while current is not None:
                if index == i:
                    prev.next = current.next
                    self.count -= 1
                    return
                i += 1
                prev = current
                current = current.next
            raise Exception("Index not found")

## Classes

`class LinkedList (head=None, tail=None, count=0)`

  initialize a doubly linked list accepts an optional head node, tail node and count if only the head node is specified, tail is set to the head node and count is automatically set to 0 if both head and tail nodes are specified, count should be specified as well

  Expand source code

      class LinkedList:
          def __init__(self, head=None, tail=None, count=0):
              ''' initialize a doubly linked list
                  accepts an optional head node, tail node and count
                  if only the head node is specified, tail is set to the head node and count is automatically set to 0
                  if both head and tail nodes are specified, count should be specified as well
              '''
              self.head = head
              if head is not None and tail is None:
                  self.tail = head
                  self.count = 1
              else:
                  self.tail = tail
                  self.count = count

          @classmethod
          def from_array(cls, mylist=None):
              ''' create a linked list from an array '''
              ll = cls()
              for value in mylist:
                  ll.append(value)

              return ll

          def __repr__(self):
              s = ""
              current = self.head
              while current is not None:
                  s += str(current.value) + " "
                  current = current.next

              return f"[{s}] Count: {self.count}"

          def search(self, value):
              ''' return index of specified value '''
              i = 0
              current = self.head
              while current is not None:
                  if current.value == value:
                      return i
                  i += 1
                  current = current.next
              raise Exception("Value not found")

          def insert(self, index, value):
              ''' insert value at a specified index '''
              i = 0

              # insert front
              if index == 0:
                  new_node = Node(value)
                  new_node.next = self.head
                  self.head = new_node
                  self.count += 1
                  return

              current = self.head
              while index < i or current is not None:
                  i += 1
                  if i == index:
                      break
                  current = current.next

              if index > i:
                  raise Exception("Index Out of Bounds")
              new_node = Node(value)
              tmp = current.next
              current.next = new_node
              new_node.next = tmp
              self.count += 1

          def append(self, value):
              ''' append value to the end of the list '''

              if self.head is None:
                  self.head = Node(value)
                  if self.count == 0:
                      self.tail = self.head
                  self.count += 1
                  return

              # go to the end of the list
              new_node = Node(value)
              self.tail.next = new_node
              self.tail = new_node

              self.count += 1

          def delete(self, index):
              ''' delete node at a specified index '''
              if index == 0:
                  if self.head is None:
                      raise Exception("LinkedList is Empty")
                  self.head = self.head.next
                  self.count -= 1
                  return

              i = 0
              current = self.head
              prev = current
              while current is not None:
                  if index == i:
                      prev.next = current.next
                      self.count -= 1
                      return
                  i += 1
                  prev = current
                  current = current.next
              raise Exception("Index not found")

  ### Static methods

  `def from_array(mylist=None)`

    create a linked list from an array

    Expand source code

        @classmethod
        def from_array(cls, mylist=None):
            ''' create a linked list from an array '''
            ll = cls()
            for value in mylist:
                ll.append(value)

            return ll

  ### Methods

  `def append(self, value)`

    append value to the end of the list

    Expand source code

        def append(self, value):
            ''' append value to the end of the list '''

            if self.head is None:
                self.head = Node(value)
                if self.count == 0:
                    self.tail = self.head
                self.count += 1
                return

            # go to the end of the list
            new_node = Node(value)
            self.tail.next = new_node
            self.tail = new_node

            self.count += 1

  `def delete(self, index)`

    delete node at a specified index

    Expand source code

        def delete(self, index):
            ''' delete node at a specified index '''
            if index == 0:
                if self.head is None:
                    raise Exception("LinkedList is Empty")
                self.head = self.head.next
                self.count -= 1
                return

            i = 0
            current = self.head
            prev = current
            while current is not None:
                if index == i:
                    prev.next = current.next
                    self.count -= 1
                    return
                i += 1
                prev = current
                current = current.next
            raise Exception("Index not found")

  `def insert(self, index, value)`

    insert value at a specified index

    Expand source code

        def insert(self, index, value):
            ''' insert value at a specified index '''
            i = 0

            # insert front
            if index == 0:
                new_node = Node(value)
                new_node.next = self.head
                self.head = new_node
                self.count += 1
                return

            current = self.head
            while index < i or current is not None:
                i += 1
                if i == index:
                    break
                current = current.next

            if index > i:
                raise Exception("Index Out of Bounds")
            new_node = Node(value)
            tmp = current.next
            current.next = new_node
            new_node.next = tmp
            self.count += 1

  `def search(self, value)`

    return index of specified value

    Expand source code

        def search(self, value):
            ''' return index of specified value '''
            i = 0
            current = self.head
            while current is not None:
                if current.value == value:
                    return i
                i += 1
                current = current.next
            raise Exception("Value not found")

`class Node (value)`
  Expand source code

      class Node:
          def __init__(self, value):
              self.value = value
              self.next = None