Java - Swap node values of a Circular Doubly Linked List
There are many instances where it is required to swap value of two nodes while working with a list. This can be achieved by traversing to the interested nodes and swap their values if the nodes are valid. For example - if the given list is 10->20->30->40->50. After swapping values of first and fourth nodes, the list will become 40->20->30->10->50.
The function swapNodeValues is created for this purpose which is a 4-step process.
void swapNodeValues(int node1, int node2) { //1. count the number of nodes in the list Node temp = new Node(); temp = this.head; int N = 0; if (temp != null) { N++; temp = temp.next; } while(temp != this.head) { N++; temp = temp.next; } //2. check if the swap positions are valid entries if(node1 < 1 || node1 > N || node2 < 1 || node2 > N) return; //3. traverse to the nodes where values to be swapped Node pos1 = this.head; Node pos2 = this.head; for(int i = 1; i < node1; i++) { pos1 = pos1.next; } for(int i = 1; i < node2; i++) { pos2 = pos2.next; } //4. swap the values of two nodes int val = pos1.data; pos1.data = pos2.data; pos2.data = val; }
The below is a complete program that uses above discussed concept to swap values of two given nodes of a 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; } } //swap node values void swapNodeValues(int node1, int node2) { Node temp = new Node(); temp = this.head; int N = 0; if (temp != null) { N++; temp = temp.next; } while(temp != this.head) { N++; temp = temp.next; } if(node1 < 1 || node1 > N || node2 < 1 || node2 > N) return; Node pos1 = this.head; Node pos2 = this.head; for(int i = 1; i < node1; i++) { pos1 = pos1.next; } for(int i = 1; i < node2; i++) { pos2 = pos2.next; } int val = pos1.data; pos1.data = pos2.data; pos2.data = val; } //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 in the list. MyList.push_back(10); MyList.push_back(20); MyList.push_back(30); MyList.push_back(40); MyList.push_back(50); //Display the content of the list. MyList.PrintList(); //swap values of node=1 and node=4 MyList.swapNodeValues(1, 4); //Display the content of the list. MyList.PrintList(); } }
The above code will give the following output:
The list contains: 10 20 30 40 50 The list contains: 40 20 30 10 50