Python Data Structures - Doubly Linked List Other Related Topics

Python - Delete last node by key of the Doubly Linked List



In this method, last node in the doubly linked list with specified key (value) is deleted. For example - if the given List is 10->20->30->20->40 and the last occurrence of 20 is deleted, the List becomes 10->20->30->40.

If the head of the doubly linked list is not null, create three nodes: 1. lastNode - to track the last node with value equal to key, 2. previousToLast - to track node previous to lastNode, and 3. temp - to traverse through the list. Then traverse the list to its end while updating lastNode and previousToLast whenever find a node with value equal to the specified key. At last delete lastNode and update links accordingly.

The function pop_last is created for this purpose. It is a 3-step process.

def pop_last(self, key):    

  #1. if head is not null create three nodes
  #   lastNode - to track last node with value
  #   equal to key, previousToLast - to track 
  #   node previous to lastNode, temp - to
  #   traverse through the list
  if(self.head != None):
    temp = None 
    previousToLast = None
    lastNode = None
    
    #2. traverse through the list and keep on updating
    #   lastNode and previousToLast whenever find a node
    #   with value equal to the specified key
    if(self.head.data == key): 
      lastNode = self.head
    
    temp = self.head
    while(temp.next != None):
      if(temp.next.data == key):
        previousToLast = temp
        lastNode = temp.next
      temp = temp.next
 
    #3. Delete the lastNode and update all links
    if(lastNode != None):
      if(lastNode == self.head):
        self.head = self.head.next
        lastNode = None
      else:
        previousToLast.next = lastNode.next
        if(previousToLast.next != None):
          previousToLast.next.prev = previousToLast
        lastNode = None

The below is a complete program that uses above discussed concept to delete last occurrence of the specified key (if exists) of the doubly linked list.

# node structure
class Node:
  def __init__(self, data):
    self.data = data
    self.next = None
    self.prev = None

#class LinkedList
class LinkedList:
  def __init__(self):
    self.head = None

  #Add new element at the end of the list
  def push_back(self, newElement):
    newNode = Node(newElement)
    if(self.head == None):
      self.head = newNode
      return
    else:
      temp = self.head
      while(temp.next != None):
        temp = temp.next
      temp.next = newNode
      newNode.prev = temp

  #Delete last node by key
  def pop_last(self, key):    
    if(self.head != None):
      temp = None 
      previousToLast = None
      lastNode = None

      if(self.head.data == key): 
        lastNode = self.head
      
      temp = self.head
      while(temp.next != None):
        if(temp.next.data == key):
          previousToLast = temp
          lastNode = temp.next
        temp = temp.next

      if(lastNode != None):
        if(lastNode == self.head):
          self.head = self.head.next
          lastNode = None
        else:
          previousToLast.next = lastNode.next
          if(previousToLast.next != None):
            previousToLast.next.prev = previousToLast
          lastNode = None

  #display the content of the list
  def PrintList(self):
    temp = self.head
    if(temp != None):
      print("The list contains:", end=" ")
      while (temp != None):
        print(temp.data, end=" ")
        temp = temp.next
      print()
    else:
      print("The list is empty.")

# test the code                
MyList = LinkedList()

#Add five elements at the end of the list.
MyList.push_back(10)
MyList.push_back(20)
MyList.push_back(30)
MyList.push_back(20)
MyList.push_back(40)
MyList.PrintList()

#Delete the last occurrence of 20
MyList.pop_last(20)
MyList.PrintList()

The above code will give the following output:

The list contains: 10 20 30 20 40 
The list contains: 10 20 30 40