Friday, August 16, 2024

Doubly Linked List (Answer)

Follow me


Link of DLL Chapter: DLL

Link of DLL Code Question: DLL Code Question



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



class DLL:
    def __init__(self,start=None):
        self.start=start
    def is_empty(self):
        return self.start==None
    def insert_at_start(self,data):
        n=Node(None,data,self.start)
        if not self.is_empty():
            self.start.prev=n
        self.start=n
    def insert_at_last(self,data):
        temp=self.start
        if self.start!=None:
            while temp.next!=None:
                temp=temp.next
        n=Node(temp,data,None)
        if temp==None:
            self.start=n
        else:
            temp.next=n
    def search(self,data):
        temp=self.start
        while temp!=None:
            if temp.items==data:
                return temp
            temp=temp.next
        return None
    def insert_after(self,temp,data):
        if temp!=None:
            n=Node(temp,data,temp.next)
            if temp.next!=None:
                temp.next.prev=n
            temp.next=n
    def print_list(self):
        temp=self.start
        while temp!=None:
            print(temp.items,end=" ")
            temp=temp.next
            print()
    def delete_first(self):
        if self.start is not None:
            self.start=self.start.next
            if self.start!=None:
                self.start.prev=None
    def delete_last(self):
        if self.start is None:
            pass
        elif self.start.next is None:
            self.start=None
        else:
            temp=self.start
            while temp.next is not None:
                temp=temp.next
            temp.prev.next=None
    def delete_item(self,data):
        if self.start is None:
            pass
        else:
            temp=self.start
            while temp is not None:
                if temp.items==data:
                    if temp.next is not None:
                        temp.next.prev=temp.prev
                    if temp.prev is not None:
                        temp.prev.next=temp.next
                    else:
                        self.start=temp.next
                    break
                temp=temp.next
    def __iter__(self):
        return DLLIterator(self.start)
class DLLIterator:
    def __init__(self,start):
        self.current=start
    def __iter__(self):
        return self
    def __next__(self):
        if not self.current:
            raise StopIteration
        data = self.current.items
        self.current=self.current.next
        return data
   
mylist=DLL()
mylist.insert_at_start(20)
mylist.insert_at_last(10)
mylist.insert_after(mylist.search(20),50)
for x in mylist:
    print(x,end=" ")


Tips to do Doubly Linked List:

  • Understand Nodes: Each node has data, prev (previous node), and next (next node).
  • Insertion: Add a new node by updating prev and next pointers of adjacent nodes and the new node.
  • Deletion: Remove a node by linking the prev of the next node and the next of the previous node to each other.
  • Traversal: Move through the list using next for forward traversal and prev for backward traversal.
  • Handle Edge Cases: Ensure proper handling when the list is empty or has only one node.
  • No comments:

    Post a Comment

    Recursion in DSA using Python

    Follow me If you want to understand with  Graphical Representation   click on it. You can find the explanatory video at the bottom of this p...