PHP - Swap node values of a Circular Singly 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 function swapNodeValues($node1, $node2) { //1. count the number of nodes in the list $temp = new Node(); $temp = $this->head; $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 $pos1 = $this->head; $pos2 = $this->head; for($i = 1; $i < $node1; $i++) { $pos1 = $pos1->next; } for($i = 1; $i < $node2; $i++) { $pos2 = $pos2->next; } //4. swap the values of two nodes $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 singly linked list.
<?php //node structure class Node { public $data; public $next; } class LinkedList { public $head; public function __construct(){ $this->head = null; } //Add new element at the end of the list public function push_back($newElement) { $newNode = new Node(); $newNode->data = $newElement; $newNode->next = null; if($this->head == null) { $this->head = $newNode; $newNode->next = $this->head; } else { $temp = new Node(); $temp = $this->head; while($temp->next !== $this->head) { $temp = $temp->next; } $temp->next = $newNode; $newNode->next = $this->head; } } //swap node values public function swapNodeValues($node1, $node2) { $temp = new Node(); $temp = $this->head; $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; $pos1 = $this->head; $pos2 = $this->head; for($i = 1; $i < $node1; $i++) { $pos1 = $pos1->next; } for($i = 1; $i < $node2; $i++) { $pos2 = $pos2->next; } $val = $pos1->data; $pos1->data = $pos2->data; $pos2->data = $val; } //display the content of the list public function PrintList() { $temp = new Node(); $temp = $this->head; if($temp != null) { echo "The list contains: "; while(true) { echo $temp->data." "; $temp = $temp->next; if($temp == $this->head) break; } echo "\n"; } else { echo "The list is empty.\n"; } } }; // test the code $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