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