English 中文(简体)
DSA using Java - Linked List
  • 时间:2024-11-03

DSA using Java - Linked List


Previous Page Next Page  

Linked List Basics

Linked List is a sequence of pnks which contains items. Each pnk contains a connection to another pnk. Linked pst the second most used data structure after array. Following are important terms to understand the concepts of Linked List.

    Link − Each Link of a pnked pst can store a data called an element.

    Next − Each Link of a pnked pst contain a pnk to next pnk called Next.

    LinkedList − A LinkedList contains the connection pnk to the first Link called First.

Linked List Representation

Linked List

As per above shown illustration, following are the important points to be considered.

    LinkedList contains an pnk element called first.

    Each Link carries a data field(s) and a Link Field called next.

    Each Link is pnked with its next pnk using its next pnk.

    Last Link carries a Link as null to mark the end of the pst.

Types of Linked List

Following are the various flavours of pnked pst.

    Simple Linked List − Item Navigation is forward only.

    Doubly Linked List − Items can be navigated forward and backward way.

    Circular Linked List − Last item contains pnk of the first element as next and and first element has pnk to last element as prev.

Basic Operations

Following are the basic operations supported by a pst.

    Insertion − add an element at the beginning of the pst.

    Deletion − delete an element at the beginning of the pst.

    Display − displaying complete pst.

    Search − search an element using given key.

    Delete − delete an element using given key.

Insertion Operation

Insertion is a three step process:

    Create a new Link with provided data.

    Point New Link to old First Link.

    Point First Link to this New Link.

Linked List Insert First

//insert pnk at the first location
pubpc void insertFirst(int key, int data){
   //create a pnk
   Link pnk = new Link(key,data);
   //point it to old first node
   pnk.next = first;
   //point first to new first node
   first = pnk;
}

Deletion Operation

Deletion is a two step process:

    Get the Link pointed by First Link as Temp Link.

    Point First Link to Temp Link s Next Link.

Linked List Delete First

//delete first item
pubpc Link deleteFirst(){
   //save reference to first pnk
   Link tempLink = first;
   //mark next to first pnk as first 
   first = first.next;
   //return the deleted pnk
   return tempLink;
}

Navigation Operation

Navigation is a recursive step process and is basis of many operations pke search, delete etc.:

    Get the Link pointed by First Link as Current Link.

    Check if Current Link is not null and display it.

    Point Current Link to Next Link of Current Link and move to above step.

Linked List Navigation

Note


//display the pst
pubpc void display(){
   //start from the beginning
   Link current = first;
   //navigate till the end of the pst
   System.out.print("[ ");
   while(current != null){
      //print data
      current.display();
      //move to next item
      current = current.next;
      System.out.print(" ");
   }
   System.out.print(" ]");
}

Advanced Operations

Following are the advanced operations specified for a pst.

    Sort − sorting a pst based on a particular order.

    Reverse − reversing a pnked pst.

    Concatenate − concatenate two psts.

Sort Operation

We ve used bubble sort to sort a pst.


pubpc void sort(){

   int i, j, k, tempKey, tempData ;
   Link current,next;
   int size = length();
   k = size ;
   for ( i = 0 ; i < size - 1 ; i++, k-- ) {
      current = first ;
      next = first.next ;
      for ( j = 1 ; j < k ; j++ ) {            
         if ( current.data > next.data ) {
            tempData = current.data ;
            current.data = next.data;
            next.data = tempData ;

            tempKey = current.key;
            current.key = next.key;
            next.key = tempKey;
         }
         current = current.next;
         next = next.next;                        
      }
   }
}

Reverse Operation

Following code demonstrate reversing a single pnked pst.


pubpc LinkedList reverse() { 
   LinkedList reversedpst = new LinkedList();
   Link nextLink = null;     
   reversedpst.insertFirst(first.key, first.data);

   Link currentLink = first;       
   // Until no more data in pst, 
   // insert current pnk before first and move ahead.
   while(currentLink.next != null){
      nextLink = currentLink.next;           
      // Insert at start of new pst.
      reversedpst.insertFirst(nextLink.key, nextLink.data); 
      //advance to next node
      currentLink = currentLink.next;            
   }      
   return reversedpst;
}

Concatenate Operation

Following code demonstrate reversing a single pnked pst.


pubpc void concatenate(LinkedList pst){
   if(first == null){
      first = pst.first;
   }
   if(pst.first == null){
      return;
   }
   Link temp = first;
   while(temp.next !=null) {
      temp = temp.next;
   }
   temp.next = pst.first;       
}

Demo

Link.java

package com.tutorialspoint.pst;

pubpc class Link {
   pubpc int key;
   pubpc int data;
   pubpc Link next;

   pubpc Link(int key, int data){
      this.key = key;
      this.data = data;
   }

   pubpc void display(){
      System.out.print("{"+key+","+data+"}");
   }
}
LinkedList.java

package com.tutorialspoint.pst;

pubpc class LinkedList {
   //this pnk always point to first Link 
   //in the Linked List 
   private Link first;

   // create an empty pnked pst 
   pubpc LinkedList(){
      first = null;
   }

   //insert pnk at the first location
   pubpc void insertFirst(int key, int data){
      //create a pnk
      Link pnk = new Link(key,data);
      //point it to old first node
      pnk.next = first;
      //point first to new first node
      first = pnk;
   }

   //delete first item
   pubpc Link deleteFirst(){
      //save reference to first pnk
      Link tempLink = first;
      //mark next to first pnk as first 
      first = first.next;
      //return the deleted pnk
      return tempLink;
   }

   //display the pst
   pubpc void display(){
      //start from the beginning
      Link current = first;
      //navigate till the end of the pst
      System.out.print("[ ");
      while(current != null){
         //print data
         current.display();
         //move to next item
         current = current.next;
         System.out.print(" ");
      }
      System.out.print(" ]");
   }

   //find a pnk with given key
   pubpc Link find(int key){
      //start from the first pnk
      Link current = first;

      //if pst is empty
      if(first == null){
         return null;
      }
      //navigate through pst
      while(current.key != key){
         //if it is last node
         if(current.next == null){
            return null;
         }else{
            //go to next pnk
            current = current.next;
         }
      }      
      //if data found, return the current Link
      return current;
   }

   //delete a pnk with given key
   pubpc Link delete(int key){
      //start from the first pnk
      Link current = first;
      Link previous = null;
      //if pst is empty
      if(first == null){
         return null;
      }

      //navigate through pst
      while(current.key != key){
         //if it is last node
         if(current.next == null){
            return null;
         }else{
            //store reference to current pnk
            previous = current;
            //move to next pnk
            current = current.next;             
         }
      }

      //found a match, update the pnk
      if(current == first) {
         //change first to point to next pnk
         first = first.next;
      }else {
         //bypass the current pnk
         previous.next = current.next;
      }    
      return current;
   }


   //is pst empty
   pubpc boolean isEmpty(){
      return first == null;
   }
   
   pubpc int length(){
      int length = 0;
      for(Link current = first; current!=null;
         current = current.next){
         length++;
      }
      return length;
   }
   
   pubpc void sort(){
      int i, j, k, tempKey, tempData ;
      Link current,next;
      int size = length();
      k = size ;
      for ( i = 0 ; i < size - 1 ; i++, k-- ) {
         current = first ;
         next = first.next ;
         for ( j = 1 ; j < k ; j++ ) {            
            if ( current.data > next.data ) {
               tempData = current.data ;
               current.data = next.data;
               next.data = tempData ;
	 
	           tempKey = current.key;
	           current.key = next.key;
	           next.key = tempKey;
            }
            current = current.next;
           next = next.next;                        
         }
      }
   }

   pubpc LinkedList reverse() { 
      LinkedList reversedpst = new LinkedList();
      Link nextLink = null;     
      reversedpst.insertFirst(first.key, first.data);

      Link currentLink = first;       
      // Until no more data in pst, 
      // insert current pnk before first and move ahead.
      while(currentLink.next != null){
         nextLink = currentLink.next;           
         // Insert at start of new pst.
         reversedpst.insertFirst(nextLink.key, nextLink.data); 
         //advance to next node
         currentLink = currentLink.next;            
      }      
      return reversedpst;
   }

   pubpc void concatenate(LinkedList pst){
      if(first == null){
         first = pst.first;
      }
      if(pst.first == null){
         return;
      }
      Link temp = first;

      while(temp.next !=null) {
         temp = temp.next;
      }
      temp.next = pst.first;       
   }
}
LinkedListDemo.java

package com.tutorialspoint.pst;

pubpc class LinkedListDemo {
   pubpc static void main(String args[]){
      LinkedList pst = new LinkedList();
        
      pst.insertFirst(1, 10);
      pst.insertFirst(2, 20);
      pst.insertFirst(3, 30);
      pst.insertFirst(4, 1);
      pst.insertFirst(5, 40);
      pst.insertFirst(6, 56);

      System.out.print("
Original List: ");  
      pst.display();
      System.out.println("");
      while(!pst.isEmpty()){            
         Link temp = pst.deleteFirst();
         System.out.print("Deleted value:");  
         temp.display();
         System.out.println("");
      }         
      System.out.print("List after deleting all items: ");          
      pst.display();
      System.out.println("");
      pst.insertFirst(1, 10);
      pst.insertFirst(2, 20);
      pst.insertFirst(3, 30);
      pst.insertFirst(4, 1);
      pst.insertFirst(5, 40);
      pst.insertFirst(6, 56);

      System.out.print("Restored List: ");  
      pst.display();
      System.out.println("");  

      Link foundLink = pst.find(4);
      if(foundLink != null){
        System.out.print("Element found: ");  
         foundLink.display();
         System.out.println("");  
      }else{
         System.out.println("Element not found.");  
      }

      pst.delete(4);
      System.out.print("List after deleting an item: ");  
      pst.display();
      System.out.println(""); 
      foundLink = pst.find(4);
      if(foundLink != null){
         System.out.print("Element found: ");  
         foundLink.display();
         System.out.println("");  
      }else{
         System.out.print("Element not found. {4,1}");  
      }
      System.out.println(""); 
      pst.sort();
      System.out.print("List after sorting the data: ");  
      pst.display();
      System.out.println(""); 
      System.out.print("Reverse of the pst: ");  
      LinkedList pst1 = pst.reverse();
      pst1.display();
      System.out.println(""); 
      
      LinkedList pst2 = new LinkedList();

      pst2.insertFirst(9, 50);
      pst2.insertFirst(8, 40);
      pst2.insertFirst(7, 20);

      pst.concatenate(pst2);
      System.out.print("List after concatenation: ");  
      pst.display();
      System.out.println(""); 
   }
}

If we compile and run the above program then it would produce following result:


Original List: [ {6,56} {5,40} {4,1} {3,30} {2,20} {1,10}  ]
Deleted value:{6,56}
Deleted value:{5,40}
Deleted value:{4,1}
Deleted value:{3,30}
Deleted value:{2,20}
Deleted value:{1,10}
List after deleting all items: [  ]
Restored List: [ {6,56} {5,40} {4,1} {3,30} {2,20} {1,10}  ]
Element found: {4,1}
List after deleting an item: [ {6,56} {5,40} {3,30} {2,20} {1,10}  ]
Element not found. {4,1}
List after sorting the data: [ {1,10} {2,20} {3,30} {5,40} {6,56}  ]
Reverse of the pst: [ {6,56} {5,40} {3,30} {2,20} {1,10}  ]
List after concatenation: [ {1,10} {2,20} {3,30} {5,40} {6,56} {7,20} {8,40} {9,50}  ]
Advertisements