528 lines
12 KiB
Java
528 lines
12 KiB
Java
|
/*This is a Java Program to implement a Doubly Linked List. A linked list is a data structure consisting of a group of nodes which together represent a sequence. Under the simplest form, each node is composed of a data and a reference (in other words, a link) to the next node in the sequence. This structure allows for efficient insertion or removal of elements from any position in the sequence. In a doubly linked list each node has two links one pointing to the next node in the list and one pointing to the previous node in the list .*/
|
||
|
|
||
|
/*
|
||
|
* Java Program to Implement Doubly Linked List
|
||
|
*/
|
||
|
|
||
|
import java.util.Scanner;
|
||
|
|
||
|
/* Class Node */
|
||
|
class Node
|
||
|
{
|
||
|
protected int data;
|
||
|
protected Node next, prev;
|
||
|
|
||
|
/* Constructor */
|
||
|
public Node()
|
||
|
{
|
||
|
next = null;
|
||
|
prev = null;
|
||
|
data = 0;
|
||
|
}
|
||
|
/* Constructor */
|
||
|
public Node(int d, Node n, Node p)
|
||
|
{
|
||
|
data = d;
|
||
|
next = n;
|
||
|
prev = p;
|
||
|
}
|
||
|
/* Function to set link to next node */
|
||
|
public void setLinkNext(Node n)
|
||
|
{
|
||
|
next = n;
|
||
|
}
|
||
|
/* Function to set link to previous node */
|
||
|
public void setLinkPrev(Node p)
|
||
|
{
|
||
|
prev = p;
|
||
|
}
|
||
|
/* Funtion to get link to next node */
|
||
|
public Node getLinkNext()
|
||
|
{
|
||
|
return next;
|
||
|
}
|
||
|
/* Function to get link to previous node */
|
||
|
public Node getLinkPrev()
|
||
|
{
|
||
|
return prev;
|
||
|
}
|
||
|
/* Function to set data to node */
|
||
|
public void setData(int d)
|
||
|
{
|
||
|
data = d;
|
||
|
}
|
||
|
/* Function to get data from node */
|
||
|
public int getData()
|
||
|
{
|
||
|
return data;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Class linkedList */
|
||
|
class linkedList
|
||
|
{
|
||
|
protected Node start;
|
||
|
protected Node end ;
|
||
|
public int size;
|
||
|
|
||
|
/* Constructor */
|
||
|
public linkedList()
|
||
|
{
|
||
|
start = null;
|
||
|
end = null;
|
||
|
size = 0;
|
||
|
}
|
||
|
/* Function to check if list is empty */
|
||
|
public boolean isEmpty()
|
||
|
{
|
||
|
return start == null;
|
||
|
}
|
||
|
/* Function to get size of list */
|
||
|
public int getSize()
|
||
|
{
|
||
|
return size;
|
||
|
}
|
||
|
/* Function to insert element at begining */
|
||
|
public void insertAtStart(int val)
|
||
|
{
|
||
|
Node nptr = new Node(val, null, null);
|
||
|
if(start == null)
|
||
|
{
|
||
|
start = nptr;
|
||
|
end = start;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
start.setLinkPrev(nptr);
|
||
|
nptr.setLinkNext(start);
|
||
|
start = nptr;
|
||
|
}
|
||
|
size++;
|
||
|
}
|
||
|
/* Function to insert element at end */
|
||
|
public void insertAtEnd(int val)
|
||
|
{
|
||
|
Node nptr = new Node(val, null, null);
|
||
|
if(start == null)
|
||
|
{
|
||
|
start = nptr;
|
||
|
end = start;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nptr.setLinkPrev(end);
|
||
|
end.setLinkNext(nptr);
|
||
|
end = nptr;
|
||
|
}
|
||
|
size++;
|
||
|
}
|
||
|
/* Function to insert element at position */
|
||
|
public void insertAtPos(int val, int pos)
|
||
|
{
|
||
|
Node nptr = new Node(val, null, null);
|
||
|
if (pos == 1)
|
||
|
{
|
||
|
insertAtStart(val);
|
||
|
return;
|
||
|
}
|
||
|
Node ptr = start;
|
||
|
for (int i = 2; i <= size; i++)
|
||
|
{
|
||
|
if (i == pos)
|
||
|
{
|
||
|
Node tmp = ptr.getLinkNext();
|
||
|
ptr.setLinkNext(nptr);
|
||
|
nptr.setLinkPrev(ptr);
|
||
|
nptr.setLinkNext(tmp);
|
||
|
tmp.setLinkPrev(nptr);
|
||
|
}
|
||
|
ptr = ptr.getLinkNext();
|
||
|
}
|
||
|
size++ ;
|
||
|
}
|
||
|
/* Function to delete node at position */
|
||
|
public void deleteAtPos(int pos)
|
||
|
{
|
||
|
if (pos == 1)
|
||
|
{
|
||
|
if (size == 1)
|
||
|
{
|
||
|
start = null;
|
||
|
end = null;
|
||
|
size = 0;
|
||
|
return;
|
||
|
}
|
||
|
start = start.getLinkNext();
|
||
|
start.setLinkPrev(null);
|
||
|
size--;
|
||
|
return ;
|
||
|
}
|
||
|
if (pos == size)
|
||
|
{
|
||
|
end = end.getLinkPrev();
|
||
|
end.setLinkNext(null);
|
||
|
size-- ;
|
||
|
}
|
||
|
Node ptr = start.getLinkNext();
|
||
|
for (int i = 2; i <= size; i++)
|
||
|
{
|
||
|
if (i == pos)
|
||
|
{
|
||
|
Node p = ptr.getLinkPrev();
|
||
|
Node n = ptr.getLinkNext();
|
||
|
p.setLinkNext(n);
|
||
|
n.setLinkPrev(p);
|
||
|
size-- ;
|
||
|
return;
|
||
|
}
|
||
|
ptr = ptr.getLinkNext();
|
||
|
}
|
||
|
}
|
||
|
/* Function to display status of list */
|
||
|
public void display()
|
||
|
{
|
||
|
System.out.print("\nDoubly Linked List = ");
|
||
|
if (size == 0)
|
||
|
{
|
||
|
System.out.print("empty\n");
|
||
|
return;
|
||
|
}
|
||
|
if (start.getLinkNext() == null)
|
||
|
{
|
||
|
System.out.println(start.getData() );
|
||
|
return;
|
||
|
}
|
||
|
Node ptr = start;
|
||
|
System.out.print(start.getData()+ " <-> ");
|
||
|
ptr = start.getLinkNext();
|
||
|
while (ptr.getLinkNext() != null)
|
||
|
{
|
||
|
System.out.print(ptr.getData()+ " <-> ");
|
||
|
ptr = ptr.getLinkNext();
|
||
|
}
|
||
|
System.out.print(ptr.getData()+ "\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Class DoublyLinkedList */
|
||
|
public class DoublyLinkedList
|
||
|
{
|
||
|
public static void main(String[] args)
|
||
|
{
|
||
|
Scanner scan = new Scanner(System.in);
|
||
|
/* Creating object of linkedList */
|
||
|
linkedList list = new linkedList();
|
||
|
System.out.println("Doubly Linked List Test\n");
|
||
|
char ch;
|
||
|
/* Perform list operations */
|
||
|
do
|
||
|
{
|
||
|
System.out.println("\nDoubly Linked List Operations\n");
|
||
|
System.out.println("1. insert at begining");
|
||
|
System.out.println("2. insert at end");
|
||
|
System.out.println("3. insert at position");
|
||
|
System.out.println("4. delete at position");
|
||
|
System.out.println("5. check empty");
|
||
|
System.out.println("6. get size");
|
||
|
int choice = scan.nextInt();
|
||
|
switch (choice)
|
||
|
{
|
||
|
case 1 :
|
||
|
System.out.println("Enter integer element to insert");
|
||
|
list.insertAtStart( scan.nextInt() );
|
||
|
break;
|
||
|
case 2 :
|
||
|
System.out.println("Enter integer element to insert");
|
||
|
list.insertAtEnd( scan.nextInt() );
|
||
|
break;
|
||
|
case 3 :
|
||
|
System.out.println("Enter integer element to insert");
|
||
|
int num = scan.nextInt() ;
|
||
|
System.out.println("Enter position");
|
||
|
int pos = scan.nextInt() ;
|
||
|
if (pos < 1 || pos > list.getSize() )
|
||
|
System.out.println("Invalid position\n");
|
||
|
else
|
||
|
list.insertAtPos(num, pos);
|
||
|
break;
|
||
|
case 4 :
|
||
|
System.out.println("Enter position");
|
||
|
int p = scan.nextInt() ;
|
||
|
if (p < 1 || p > list.getSize() )
|
||
|
System.out.println("Invalid position\n");
|
||
|
else
|
||
|
list.deleteAtPos(p);
|
||
|
break;
|
||
|
case 5 :
|
||
|
System.out.println("Empty status = "+ list.isEmpty());
|
||
|
break;
|
||
|
case 6 :
|
||
|
System.out.println("Size = "+ list.getSize() +" \n");
|
||
|
break;
|
||
|
default :
|
||
|
System.out.println("Wrong Entry \n ");
|
||
|
break;
|
||
|
}
|
||
|
/* Display List */
|
||
|
list.display();
|
||
|
System.out.println("\nDo you want to continue (Type y or n) \n");
|
||
|
ch = scan.next().charAt(0);
|
||
|
}
|
||
|
while (ch == 'Y'|| ch == 'y');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
1
|
||
|
Enter integer element to insert
|
||
|
5
|
||
|
|
||
|
Doubly Linked List = 5
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
1
|
||
|
Enter integer element to insert
|
||
|
2
|
||
|
|
||
|
Doubly Linked List = 2 <-> 5
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
2
|
||
|
Enter integer element to insert
|
||
|
6
|
||
|
|
||
|
Doubly Linked List = 2 <-> 5 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
1
|
||
|
Enter integer element to insert
|
||
|
7
|
||
|
|
||
|
Doubly Linked List = 7 <-> 2 <-> 5 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
3
|
||
|
Enter integer element to insert
|
||
|
3
|
||
|
Enter position
|
||
|
3
|
||
|
|
||
|
Doubly Linked List = 7 <-> 2 <-> 3 <-> 5 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
4
|
||
|
Enter position
|
||
|
2
|
||
|
|
||
|
Doubly Linked List = 7 <-> 3 <-> 5 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
3
|
||
|
Enter integer element to insert
|
||
|
4
|
||
|
Enter position
|
||
|
4
|
||
|
|
||
|
Doubly Linked List = 7 <-> 3 <-> 5 <-> 4 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
6
|
||
|
Size = 5
|
||
|
|
||
|
|
||
|
Doubly Linked List = 7 <-> 3 <-> 5 <-> 4 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
4
|
||
|
Enter position
|
||
|
1
|
||
|
|
||
|
Doubly Linked List = 3 <-> 5 <-> 4 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
4
|
||
|
Enter position
|
||
|
2
|
||
|
|
||
|
Doubly Linked List = 3 <-> 4 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
4
|
||
|
Enter position
|
||
|
2
|
||
|
|
||
|
Doubly Linked List = 3 <-> 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
4
|
||
|
Enter position
|
||
|
1
|
||
|
|
||
|
Doubly Linked List = 6
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
4
|
||
|
Enter position
|
||
|
1
|
||
|
|
||
|
Doubly Linked List = empty
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
y
|
||
|
|
||
|
Doubly Linked List Operations
|
||
|
|
||
|
1. insert at begining
|
||
|
2. insert at end
|
||
|
3. insert at position
|
||
|
4. delete at position
|
||
|
5. check empty
|
||
|
6. get size
|
||
|
5
|
||
|
Empty status = true
|
||
|
|
||
|
Doubly Linked List = empty
|
||
|
|
||
|
Do you want to continue (Type y or n)
|
||
|
|
||
|
n
|