Java Data Structures - Circular Doubly Linked List Other Related Topics

Java - Delete last node by key of the Circular Doubly Linked List



In this method, last node in the circular 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 circular singly 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.

void pop_last(int 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(head != null) {
    Node previousToLast, lastNode, temp; 
    previousToLast = null;
    lastNode = null;
    
    //2. traverse through the list and keep on updating
    //   lastNode and previousToLast whenever find a node
    //   with value equal to the specified key
    if(head.data == key) 
      lastNode = head;
    
    temp = head;
    while(temp.next != head) {
      if(temp.next.data == key) {
        previousToLast = temp;
        lastNode = temp.next;
      }
      temp = temp.next;
    }
 
    //3. Delete the lastNode and update all links
    if(lastNode != null) {
      if(lastNode == head) {
        if(head.next == head)
          head = null;
        else {
          head.prev.next = head.next;
          head = head.next;
        }
        lastNode = null;
      } else {
        previousToLast.next = lastNode.next;
        previousToLast.next.prev = previousToLast;
        lastNode = null;
      }
    }
  }
} 

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

//node structure
class Node {
    int data;
    Node next;
    Node prev;
};

class LinkedList {
  Node head;

  LinkedList(){
    head = null;
  }

  //Add new element at the end of the list
  void push_back(int newElement) {
    Node newNode = new Node();
    newNode.data = newElement;
    newNode.next = null; 
    newNode.next = null;
    if(head == null) {
      head = newNode;
      newNode.next = head;
      newNode.prev = head;
    } else {
      Node temp = new Node();
      temp = head;
      while(temp.next != head)
        temp = temp.next;
      temp.next = newNode;
      newNode.next = head;
      newNode.prev = temp;
      head.prev = newNode;
    }    
  }

  //Delete last node by key
  void pop_last(int key) {     
    if(head != null) {
      Node previousToLast, lastNode, temp; 
      previousToLast = null;
      lastNode = null;

      if(head.data == key) 
        lastNode = head;
      
      temp = head;
      while(temp.next != head) {
        if(temp.next.data == key) {
          previousToLast = temp;
          lastNode = temp.next;
        }
        temp = temp.next;
      }

      if(lastNode != null) {
        if(lastNode == head) {
          if(head.next == head)
            head = null;
          else {
            head.prev.next = head.next;
            head = head.next;
          }
          lastNode = null;
        } else {
          previousToLast.next = lastNode.next;
          previousToLast.next.prev = previousToLast;
          lastNode = null;
        }
      }
    }
  } 

  //display the content of the list
  void PrintList() {
    Node temp = new Node();
    temp = this.head;
    if(temp != null) {
      System.out.print("The list contains: ");
      while(true) {
        System.out.print(temp.data + " ");
        temp = temp.next;
        if(temp == this.head)
          break;
      }
      System.out.println();
    } else {
      System.out.println("The list is empty.");
    }
  }     
};

// test the code 
public class Implementation {
  public static void main(String[] args) {
    LinkedList MyList = new 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 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 

5