C# Data Structures - Circular Doubly Linked List Other Related Topics

C# - 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.

public 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.

using System;

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

class LinkedList {
  Node head;

  public LinkedList(){
    head = null;
  }
  
  //Add new element at the end of the list
  public void push_back(int newElement) {
    Node newNode = new Node();
    newNode.data = newElement;
    newNode.next = null; 
    newNode.prev = 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
  public 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
  public void PrintList() {
    Node temp = new Node();
    temp = this.head;
    if(temp != null) {
      Console.Write("The list contains: ");
      while(true) {
        Console.Write(temp.data + " ");
        temp = temp.next;
        if(temp == this.head)
          break;        
      }
      Console.WriteLine();
    } else {
      Console.WriteLine("The list is empty.");
    }
  }      
};

// test the code
class Implementation {  
  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