How do I change a node in a linked list?

Modify contents of Linked List

Given a singly linked list containing n nodes. Modify the value of first half nodes such that 1st node’s new value is equal to the last node’s value minus first node’s current value, 2nd node’s new value is equal to the second last node’s value minus 2nd node’s current value, likewise for first half nodes. If n is odd then the value of the middle node remains unchanged.
[No extra memory to be used].

Examples:

Input : 10 -> 4 -> 5 -> 3 -> 6 Output : 4 -> 1 -> 5 -> 3 -> 6 Input : 2 -> 9 -> 8 -> 12 -> 7 -> 10 Output : -8 -> 2 -> -4 -> 12 -> 7 -> 10

Asked in Amazon Interview

Swap nodes in a linked list without swapping data

Given a linked list and two keys in it, swap nodes for two given keys. Nodes should be swapped by changing links. Swapping data of nodes may be expensive in many situations when data contains many fields.

It may be assumed that all keys in the linked list are distinct.

Examples:

Input : 10->15->12->13->20->14, x = 12, y = 20 Output: 10->15->20->13->12->14 Input : 10->15->12->13->20->14, x = 10, y = 20 Output: 20->15->12->13->10->14 Input : 10->15->12->13->20->14, x = 12, y = 13 Output: 10->15->13->12->20->14

This may look like a simple problem, but is an interesting question as it has the following cases to be handled.

  1. x and y may or may not be adjacent.
  2. Either x or y may be a head node.
  3. Either x or y may be the last node.
  4. x and/or y may not be present in the linked list.

How to write a clean working code that handles all the above possibilities.



The idea is to first search x and y in the given linked list. If any of them is not present, then return. While searching for x and y, keep track of current and previous pointers. First change next of previous pointers, then change next of current pointers.

Below is the implementation of the above approach.

C++




/* This program swaps the nodes of linked list rather

than swapping the field from the nodes.*/

#include

using namespace std;

/* A linked list node */

class Node {

public:

int data;

Node* next;

};

/* Function to swap nodes x and y in linked list by

changing links */

void swapNodes[Node** head_ref, int x, int y]

{

// Nothing to do if x and y are same

if [x == y]

return;

// Search for x [keep track of prevX and CurrX

Node *prevX = NULL, *currX = *head_ref;

while [currX && currX->data != x] {

prevX = currX;

currX = currX->next;

}

// Search for y [keep track of prevY and CurrY

Node *prevY = NULL, *currY = *head_ref;

while [currY && currY->data != y] {

prevY = currY;

currY = currY->next;

}

// If either x or y is not present, nothing to do

if [currX == NULL || currY == NULL]

return;

// If x is not head of linked list

if [prevX != NULL]

prevX->next = currY;

else // Else make y as new head

*head_ref = currY;

// If y is not head of linked list

if [prevY != NULL]

prevY->next = currX;

else // Else make x as new head

*head_ref = currX;

// Swap next pointers

Node* temp = currY->next;

currY->next = currX->next;

currX->next = temp;

}

/* Function to add a node at the beginning of List */

void push[Node** head_ref, int new_data]

{

/* allocate node */

Node* new_node = new Node[];

/* put in the data */

new_node->data = new_data;

/* link the old list off the new node */

new_node->next = [*head_ref];

/* move the head to point to the new node */

[*head_ref] = new_node;

}

/* Function to print nodes in a given linked list */

void printList[Node* node]

{

while [node != NULL] {

cout data next;

}

}

/* Driver program to test above function */

int main[]

{

Node* start = NULL;

/* The constructed linked list is:

1->2->3->4->5->6->7 */

push[&start, 7];

push[&start, 6];

push[&start, 5];

push[&start, 4];

push[&start, 3];

push[&start, 2];

push[&start, 1];

cout next;

}

// Search for y [keep track of prevY and CurrY

struct Node *prevY = NULL, *currY = *head_ref;

while [currY && currY->data != y] {

prevY = currY;

currY = currY->next;

}

// If either x or y is not present, nothing to do

if [currX == NULL || currY == NULL]

return;

// If x is not head of linked list

if [prevX != NULL]

prevX->next = currY;

else // Else make y as new head

*head_ref = currY;

// If y is not head of linked list

if [prevY != NULL]

prevY->next = currX;

else // Else make x as new head

*head_ref = currX;

// Swap next pointers

struct Node* temp = currY->next;

currY->next = currX->next;

currX->next = temp;

}

/* Function to add a node at the beginning of List */

void push[struct Node** head_ref, int new_data]

{

/* allocate node */

struct Node* new_node

= [struct Node*]malloc[sizeof[struct Node]];

/* put in the data */

new_node->data = new_data;

/* link the old list off the new node */

new_node->next = [*head_ref];

/* move the head to point to the new node */

[*head_ref] = new_node;

}

/* Function to print nodes in a given linked list */

void printList[struct Node* node]

{

while [node != NULL] {

printf["%d ", node->data];

node = node->next;

}

}

/* Driver program to test above function */

int main[]

{

struct Node* start = NULL;

/* The constructed linked list is:

1->2->3->4->5->6->7 */

push[&start, 7];

push[&start, 6];

push[&start, 5];

push[&start, 4];

push[&start, 3];

push[&start, 2];

push[&start, 1];

printf["\n Linked list before calling swapNodes[] "];

printList[start];

swapNodes[&start, 4, 3];

printf["\n Linked list after calling swapNodes[] "];

printList[start];

return 0;

}

Java




// Java program to swap two given nodes of a linked list

class Node {

int data;

Node next;

Node[int d]

{

data = d;

next = null;

}

}

class LinkedList {

Node head; // head of list

/* Function to swap Nodes x and y in linked list by

changing links */

public void swapNodes[int x, int y]

{

// Nothing to do if x and y are same

if [x == y]

return;

// Search for x [keep track of prevX and CurrX]

Node prevX = null, currX = head;

while [currX != null && currX.data != x] {

prevX = currX;

currX = currX.next;

}

// Search for y [keep track of prevY and currY]

Node prevY = null, currY = head;

while [currY != null && currY.data != y] {

prevY = currY;

currY = currY.next;

}

// If either x or y is not present, nothing to do

if [currX == null || currY == null]

return;

// If x is not head of linked list

if [prevX != null]

prevX.next = currY;

else // make y the new head

head = currY;

// If y is not head of linked list

if [prevY != null]

prevY.next = currX;

else // make x the new head

head = currX;

// Swap next pointers

Node temp = currX.next;

currX.next = currY.next;

currY.next = temp;

}

/* Function to add Node at beginning of list. */

public void push[int new_data]

{

/* 1. alloc the Node and put the data */

Node new_Node = new Node[new_data];

/* 2. Make next of new Node as head */

new_Node.next = head;

/* 3. Move the head to point to new Node */

head = new_Node;

}

/* This function prints contents of linked list starting

from the given Node */

public void printList[]

{

Node tNode = head;

while [tNode != null] {

System.out.print[tNode.data + " "];

tNode = tNode.next;

}

}

/* Driver program to test above function */

public static void main[String[] args]

{

LinkedList llist = new LinkedList[];

/* The constructed linked list is:

1->2->3->4->5->6->7 */

llist.push[7];

llist.push[6];

llist.push[5];

llist.push[4];

llist.push[3];

llist.push[2];

llist.push[1];

System.out.print[

"\n Linked list before calling swapNodes[] "];

llist.printList[];

llist.swapNodes[4, 3];

System.out.print[

"\n Linked list after calling swapNodes[] "];

llist.printList[];

}

}

// This code is contributed by Rajat Mishra

Python




# Python program to swap two given nodes of a linked list

class LinkedList[object]:

def __init__[self]:

self.head = None

# head of list

class Node[object]:

def __init__[self, d]:

self.data = d

self.next = None

# Function to swap Nodes x and y in linked list by

# changing links

def swapNodes[self, x, y]:

# Nothing to do if x and y are same

if x == y:

return

# Search for x [keep track of prevX and CurrX]

prevX = None

currX = self.head

while currX != None and currX.data != x:

prevX = currX

currX = currX.next

# Search for y [keep track of prevY and currY]

prevY = None

currY = self.head

while currY != None and currY.data != y:

prevY = currY

currY = currY.next

# If either x or y is not present, nothing to do

if currX == None or currY == None:

return

# If x is not head of linked list

if prevX != None:

prevX.next = currY

else: # make y the new head

self.head = currY

# If y is not head of linked list

if prevY != None:

prevY.next = currX

else: # make x the new head

self.head = currX

# Swap next pointers

temp = currX.next

currX.next = currY.next

currY.next = temp

# Function to add Node at beginning of list.

def push[self, new_data]:

# 1. alloc the Node and put the data

new_Node = self.Node[new_data]

# 2. Make next of new Node as head

new_Node.next = self.head

# 3. Move the head to point to new Node

self.head = new_Node

# This function prints contents of linked list starting

# from the given Node

def printList[self]:

tNode = self.head

while tNode != None:

print tNode.data,

tNode = tNode.next

# Driver program to test above function

llist = LinkedList[]

# The constructed linked list is:

# 1->2->3->4->5->6->7

llist.push[7]

llist.push[6]

llist.push[5]

llist.push[4]

llist.push[3]

llist.push[2]

llist.push[1]

print "Linked list before calling swapNodes[] "

llist.printList[]

llist.swapNodes[4, 3]

print "\nLinked list after calling swapNodes[] "

llist.printList[]

# This code is contributed by BHAVYA JAIN

C#




// C# program to swap two given

// nodes of a linked list

using System;

class Node {

public int data;

public Node next;

public Node[int d]

{

data = d;

next = null;

}

}

public class LinkedList {

Node head; // head of list

/* Function to swap Nodes x and y in

linked list by changing links */

public void swapNodes[int x, int y]

{

// Nothing to do if x and y are same

if [x == y]

return;

// Search for x [keep track of prevX and CurrX]

Node prevX = null, currX = head;

while [currX != null && currX.data != x] {

prevX = currX;

currX = currX.next;

}

// Search for y [keep track of prevY and currY]

Node prevY = null, currY = head;

while [currY != null && currY.data != y] {

prevY = currY;

currY = currY.next;

}

// If either x or y is not present, nothing to do

if [currX == null || currY == null]

return;

// If x is not head of linked list

if [prevX != null]

prevX.next = currY;

else // make y the new head

head = currY;

// If y is not head of linked list

if [prevY != null]

prevY.next = currX;

else // make x the new head

head = currX;

// Swap next pointers

Node temp = currX.next;

currX.next = currY.next;

currY.next = temp;

}

/* Function to add Node at beginning of list. */

public void push[int new_data]

{

/* 1. alloc the Node and put the data */

Node new_Node = new Node[new_data];

/* 2. Make next of new Node as head */

new_Node.next = head;

/* 3. Move the head to point to new Node */

head = new_Node;

}

/* This function prints contents of linked list

starting from the given Node */

public void printList[]

{

Node tNode = head;

while [tNode != null] {

Console.Write[tNode.data + " "];

tNode = tNode.next;

}

}

/* Driver code */

public static void Main[String[] args]

{

LinkedList llist = new LinkedList[];

/* The constructed linked list is:

1->2->3->4->5->6->7 */

llist.push[7];

llist.push[6];

llist.push[5];

llist.push[4];

llist.push[3];

llist.push[2];

llist.push[1];

Console.Write[

"\n Linked list before calling swapNodes[] "];

llist.printList[];

llist.swapNodes[4, 3];

Console.Write[

"\n Linked list after calling swapNodes[] "];

llist.printList[];

}

}

// This code is contributed by 29AjayKumar

Javascript




// JavaScript program to swap two

// given nodes of a linked list

class Node {

constructor[val] {

this.data = val;

this.next = null;

}

}

var head; // head of list

/*

Function to swap Nodes x and y in

linked list by changing links

*/

function swapNodes[x , y] {

// Nothing to do if x and y are same

if [x == y]

return;

// Search for x [keep track of prevX and CurrX]

var prevX = null, currX = head;

while [currX != null && currX.data != x] {

prevX = currX;

currX = currX.next;

}

// Search for y [keep track of prevY and currY]

var prevY = null, currY = head;

while [currY != null && currY.data != y] {

prevY = currY;

currY = currY.next;

}

// If either x or y is not present, nothing to do

if [currX == null || currY == null]

return;

// If x is not head of linked list

if [prevX != null]

prevX.next = currY;

else // make y the new head

head = currY;

// If y is not head of linked list

if [prevY != null]

prevY.next = currX;

else // make x the new head

head = currX;

// Swap next pointers

var temp = currX.next;

currX.next = currY.next;

currY.next = temp;

}

/* Function to add Node at beginning of list. */

function push[new_data] {

/* 1. alloc the Node and put the data */

var new_Node = new Node[new_data];

/* 2. Make next of new Node as head */

new_Node.next = head;

/* 3. Move the head to point to new Node */

head = new_Node;

}

/*

This function prints contents of

linked list starting from the given Node

*/

function printList[] {

var tNode = head;

while [tNode != null] {

document.write[tNode.data + " "];

tNode = tNode.next;

}

}

/* Driver program to test above function */

/*

The constructed linked list is:

1->2->3->4->5->6->7

*/

push[7];

push[6];

push[5];

push[4];

push[3];

push[2];

push[1];

document.write[

" Linked list before calling swapNodes[]
"]

;

printList[];

swapNodes[4, 3];

document.write[

"
Linked list after calling swapNodes[]
"

];

printList[];

// This code is contributed by todaysgaurav

Output Linked list before calling swapNodes[] 1 2 3 4 5 6 7 Linked list after calling swapNodes[] 1 2 4 3 5 6 7

Optimizations: The above code can be optimized to search x and y in a single traversal. Two loops are used to keep the program simple.

Simpler approach –

C++




// C++ program to swap two given nodes of a linked list

#include

using namespace std;

// A linked list node class

class Node {

public:

int data;

class Node* next;

// constructor

Node[int val, Node* next]

: data[val]

, next[next]

{

}

// print list from this

// to last till null

void printList[]

{

Node* node = this;

while [node != NULL] {

cout data next;

}

cout data == x] {

a = head_ref;

}

else if [[*head_ref]->data == y] {

b = head_ref;

}

head_ref = &[[*head_ref]->next];

}

// if we have found both a and b

// in the linked list swap current

// pointer and next pointer of these

if [a && b] {

swap[*a, *b];

swap[[[*a]->next], [[*b]->next]];

}

}

// Driver code

int main[]

{

Node* start = NULL;

// The constructed linked list is:

// 1->2->3->4->5->6->7

push[&start, 7];

push[&start, 6];

push[&start, 5];

push[&start, 4];

push[&start, 3];

push[&start, 2];

push[&start, 1];

cout printList[];

swapNodes[&start, 6, 1];

cout printList[];

}

Java




// Java program to swap two given nodes of a linked list

public class Solution {

// Represent a node of the singly linked list

class Node {

int data;

Node next;

public Node[int data]

{

this.data = data;

this.next = null;

}

}

// Represent the head and tail of the singly linked list

public Node head = null;

public Node tail = null;

// addNode[] will add a new node to the list

public void addNode[int data]

{

// Create a new node

Node newNode = new Node[data];

// Checks if the list is empty

if [head == null] {

// If list is empty, both head and

// tail will point to new node

head = newNode;

tail = newNode;

}

else {

// newNode will be added after tail such that

// tail's next will point to newNode

tail.next = newNode;

// newNode will become new tail of the list

tail = newNode;

}

}

// swap[] will swap the given two nodes

public void swap[int n1, int n2]

{

Node prevNode1 = null, prevNode2 = null,

node1 = head, node2 = head;

// Checks if list is empty

if [head == null] {

return;

}

// If n1 and n2 are equal, then

// list will remain the same

if [n1 == n2]

return;

// Search for node1

while [node1 != null && node1.data != n1] {

prevNode1 = node1;

node1 = node1.next;

}

// Search for node2

while [node2 != null && node2.data != n2] {

prevNode2 = node2;

node2 = node2.next;

}

if [node1 != null && node2 != null] {

// If previous node to node1 is not null then,

// it will point to node2

if [prevNode1 != null]

prevNode1.next = node2;

else

head = node2;

// If previous node to node2 is not null then,

// it will point to node1

if [prevNode2 != null]

prevNode2.next = node1;

else

head = node1;

// Swaps the next nodes of node1 and node2

Node temp = node1.next;

node1.next = node2.next;

node2.next = temp;

}

else {

System.out.println["Swapping is not possible"];

}

}

// display[] will display all the

// nodes present in the list

public void display[]

{

// Node current will point to head

Node current = head;

if [head == null] {

System.out.println["List is empty"];

return;

}

while [current != null] {

// Prints each node by incrementing pointer

System.out.print[current.data + " "];

current = current.next;

}

System.out.println[];

}

public static void main[String[] args]

{

Solution sList = new Solution[];

// Add nodes to the list

sList.addNode[1];

sList.addNode[2];

sList.addNode[3];

sList.addNode[4];

sList.addNode[5];

sList.addNode[6];

sList.addNode[7];

System.out.println["Original list: "];

sList.display[];

// Swaps the node 2 with node 5

sList.swap[6, 1];

System.out.println["List after swapping nodes: "];

sList.display[];

}

}

Python3




# Python3 program to swap two given

# nodes of a linked list

# A linked list node class

class Node:

# constructor

def __init__[self, val=None, next1=None]:

self.data = val

self.next = next1

# print list from this

# to last till None

def printList[self]:

node = self

while [node != None]:

print[node.data, end=" "]

node = node.next

print[" "]

# Function to add a node

# at the beginning of List

def push[head_ref, new_data]:

# allocate node

[head_ref] = Node[new_data, head_ref]

return head_ref

def swapNodes[head_ref, x, y]:

head = head_ref

# Nothing to do if x and y are same

if [x == y]:

return None

a = None

b = None

# search for x and y in the linked list

# and store therir pointer in a and b

while [head_ref.next != None]:

if [[head_ref.next].data == x]:

a = head_ref

elif [[head_ref.next].data == y]:

b = head_ref

head_ref = [[head_ref].next]

# if we have found both a and b

# in the linked list swap current

# pointer and next pointer of these

if [a != None and b != None]:

temp = a.next

a.next = b.next

b.next = temp

temp = a.next.next

a.next.next = b.next.next

b.next.next = temp

return head

# Driver code

start = None

# The constructed linked list is:

# 1.2.3.4.5.6.7

start = push[start, 7]

start = push[start, 6]

start = push[start, 5]

start = push[start, 4]

start = push[start, 3]

start = push[start, 2]

start = push[start, 1]

print["Linked list before calling swapNodes[] "]

start.printList[]

start = swapNodes[start, 6, 1]

print["Linked list after calling swapNodes[] "]

start.printList[]

# This code is contributed by Arnab Kundu

C#




// C# program to swap two

// given nodes of a linked list

using System;

class GFG {

// A linked list node class

public class Node {

public int data;

public Node next;

// constructor

public Node[int val, Node next1]

{

data = val;

next = next1;

}

// print list from this

// to last till null

public void printList[]

{

Node node = this;

while [node != null] {

Console.Write[node.data + " "];

node = node.next;

}

Console.WriteLine[];

}

}

// Function to add a node

// at the beginning of List

static Node push[Node head_ref, int new_data]

{

// allocate node

[head_ref] = new Node[new_data, head_ref];

return head_ref;

}

static Node swapNodes[Node head_ref, int x, int y]

{

Node head = head_ref;

// Nothing to do if x and y are same

if [x == y]

return null;

Node a = null, b = null;

// search for x and y in the linked list

// and store therir pointer in a and b

while [head_ref.next != null] {

if [[head_ref.next].data == x] {

a = head_ref;

}

else if [[head_ref.next].data == y] {

b = head_ref;

}

head_ref = [[head_ref].next];

}

// if we have found both a and b

// in the linked list swap current

// pointer and next pointer of these

if [a != null && b != null] {

Node temp = a.next;

a.next = b.next;

b.next = temp;

temp = a.next.next;

a.next.next = b.next.next;

b.next.next = temp;

}

return head;

}

// Driver code

public static void Main[]

{

Node start = null;

// The constructed linked list is:

// 1.2.3.4.5.6.7

start = push[start, 7];

start = push[start, 6];

start = push[start, 5];

start = push[start, 4];

start = push[start, 3];

start = push[start, 2];

start = push[start, 1];

Console.Write[

"Linked list before calling swapNodes[] "];

start.printList[];

start = swapNodes[start, 6, 1];

Console.Write[

"Linked list after calling swapNodes[] "];

start.printList[];

}

}

/* This code contributed by PrinciRaj1992 */

Javascript




// javascript program to swap two given nodes of a linked list

// Represent a node of the singly linked list

class Node {

constructor[val] {

this.data = val;

this.next = null;

}

}

// Represent the head and tail of the singly linked list

var head = null;

var tail = null;

// addNode[] will add a new node to the list

function addNode[data] {

// Create a new node

var newNode = new Node[data];

// Checks if the list is empty

if [head == null] {

// If list is empty, both head and

// tail will point to new node

head = newNode;

tail = newNode;

} else {

// newNode will be added after tail such that

// tail's next will point to newNode

tail.next = newNode;

// newNode will become new tail of the list

tail = newNode;

}

}

// swap[] will swap the given two nodes

function swap[n1 , n2] {

var prevNode1 = null, prevNode2 = null, node1 = head, node2 = head;

// Checks if list is empty

if [head == null] {

return;

}

// If n1 and n2 are equal, then

// list will remain the same

if [n1 == n2]

return;

// Search for node1

while [node1 != null && node1.data != n1] {

prevNode1 = node1;

node1 = node1.next;

}

// Search for node2

while [node2 != null && node2.data != n2] {

prevNode2 = node2;

node2 = node2.next;

}

if [node1 != null && node2 != null] {

// If previous node to node1 is not null then,

// it will point to node2

if [prevNode1 != null]

prevNode1.next = node2;

else

head = node2;

// If previous node to node2 is not null then,

// it will point to node1

if [prevNode2 != null]

prevNode2.next = node1;

else

head = node1;

// Swaps the next nodes of node1 and node2

var temp = node1.next;

node1.next = node2.next;

node2.next = temp;

} else {

document.write["Swapping is not possible"];

}

}

// display[] will display all the

// nodes present in the list

function display[] {

// Node current will point to head

var current = head;

if [head == null] {

document.write["List is empty"];

return;

}

while [current != null] {

// Prints each node by incrementing pointer

document.write[current.data + " "];

current = current.next;

}

document.write[];

}

// Add nodes to the list

addNode[1];

addNode[2];

addNode[3];

addNode[4];

addNode[5];

addNode[6];

addNode[7];

document.write["Original list:
"];

display[];

// Swaps the node 2 with node 5

swap[6, 1];

document.write["
List after swapping nodes:
"];

display[];

// This code contributed by aashish2995

Output Linked list before calling swapNodes[] 1 2 3 4 5 6 7 Linked list after calling swapNodes[] 6 2 3 4 5 1 7

//www.youtube.com/watch?v=V4ZHvhvVmSE

This article is contributed by Gautam. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.




Article Tags :

Linked List

Practice Tags :

Linked List

Read Full Article

C


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

#include

#include

// A Linked List Node

struct Node

{

int data;

struct Node* next;

};

// Helper function to print a given linked list

void printList[struct Node* head]

{

struct Node* ptr = head;

while [ptr]

{

printf["%d —> ", ptr->data];

ptr = ptr->next;

}

printf["NULL\n"];

}

// Helper function to insert a new node at the beginning of the linked list

void push[struct Node** head, int data]

{

struct Node* newNode = [struct Node*]malloc[sizeof[struct Node]];

newNode->data = data;

newNode->next = *head;

*head = newNode;

}

// Function takes the node from the front of the source and move it

// to the front of the destination

void moveNode[struct Node** destRef, struct Node** sourceRef]

{

// if the source list empty, do nothing

if [*sourceRef == NULL] {

return;

}

struct Node* newNode = *sourceRef;// the front source node

*sourceRef = [*sourceRef]->next;// advance the source pointer

newNode->next = *destRef; // link the old dest off the new node

*destRef = newNode; // move dest to point to the new node

}

int main[void]

{

// input keys

int keys[] = { 1, 2, 3 };

int n = sizeof[keys]/sizeof[keys[0]];

// construct the first linked list

struct Node* a = NULL;

for [int i = n-1; i >= 0; i--] {

push[&a, keys[i]];

}

// construct the second linked list

struct Node* b = NULL;

for [int i = 0; i 1 —> 2 —> 3 —> NULL
Second List: 4 —> 2 —> NULL

C


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

#include

#include

// A Linked List Node

struct Node

{

int data;

struct Node* next;

};

// Helper function to create a new node with the given data and

// pushes it onto the list's front

void push[struct Node** head, int data]

{

// create a new linked list node from the heap

struct Node* newNode = [struct Node*]malloc[sizeof[struct Node]];

newNode->data = data;

newNode->next = *head;

*head = newNode;

}

// Helper function to print a given linked list

void printList[struct Node* head]

{

struct Node* ptr = head;

while [ptr]

{

printf["%d —> ", ptr->data];

ptr = ptr->next;

}

printf["NULL"];

}

// Function to move the last node to the front of a given linked list

void rearrange[struct Node** head]

{

// proceed only when the list is valid

if [!*head || ![*head]->next] {

return;

}

struct Node* ptr = *head;

// move to the second last node

while [ptr->next->next] {

ptr = ptr->next;

}

// transform the list into a circular list

ptr->next->next = *head;

// Fix the head pointer

*head = ptr->next;

// break the chain

ptr->next= NULL;

}

int main[void]

{

// input keys

int keys[] = { 1, 2, 3, 4 };

int n = sizeof[keys] / sizeof[keys[0]];

struct Node* head = NULL;

for [int i = n - 1; i >= 0; i--] {

push[&head, keys[i]];

}

rearrange[&head];

printList[head];

return 0;

}

DownloadRun Code

Output:

4 —> 1 —> 2 —> 3 —> NULL

Linked List Operations: Traverse, Insert and Delete

In this tutorial, you will learn different operations on a linked list. Also, you will find implementation of linked list operations in C/C++, Python and Java.

There are various linked list operations that allow us to perform different actions on linked lists. For example, the insertion operation adds a new element to the linked list.

Here's a list of basic linked list operations that we will cover in this article.

  • Traversal - access each element of the linked list
  • Insertion - adds a new element to the linked list
  • Deletion - removes the existing elements
  • Search - find a node in the linked list
  • Sort - sort the nodes of the linked list

Before you learn about linked list operations in detail, make sure to know about Linked List first.

Things to Remember about Linked List

  • head points to the first node of the linked list
  • next pointer of the last node is NULL, so if the next current node is NULL, we have reached the end of the linked list.

In all of the examples, we will assume that the linked list has three nodes 1 --->2 --->3 with node structure as below:

struct node { int data; struct node *next; };

C++

// C++ implementation to modify the

// contents of the linked list

#include

using namespace std;

// Linked list node

struct Node

{

int data;

struct Node* next;

};

// function prototype for printing the list

void printList[struct Node*];

// Function to insert a node at the

// beginning of the linked list

void push[struct Node **head_ref,int new_data]

{

// allocate node

struct Node* new_node =

[struct Node*]malloc[sizeof[struct Node]];

// put in the data

new_node->data = new_data;

// link the old list at the end of the new node

new_node->next = *head_ref;

// move the head to point to the new node

*head_ref = new_node;

}

// function to print the linked list

void printList[struct Node *head]

{

if [!head]

return;

while [head->next != NULL]

{

cout data next;

}

cout data next]

{

// Advance 'fast' two nodes, and

advance'slow' one node

slow = slow->next ;

fast = fast->next->next ;

}

// If number of nodes are odd then update slow

// by slow->next;

if[fast]

slow = slow->next ;

return slow ;

}

// function to modify the contents of the linked list.

void modifyTheList[struct Node *head,struct Node *slow]

{

// Create Stack.

stack s;

Node *temp = head ;

while[slow]

{

s.push[ slow->data ] ;

slow = slow->next ;

}

// Traverse the list by using temp until stack is empty.

while[ !s.empty[] ]

{

temp->data = temp->data - s.top[] ;

temp = temp->next ;

s.pop[] ;

}

}

// Driver program to test above

int main[]

{

struct Node *head = NULL, *mid ;

// creating the linked list

push[&head, 10];

push[&head, 7];

push[&head, 12];

push[&head, 8];

push[&head, 9];

push[&head, 2];

// Call Function to Find the starting point of second half of list.

mid = find_mid[head] ;

// Call function to modify the contents of the linked list.

modifyTheList[ head, mid];

// print the modified linked list

cout 12 -> 7 -> 10

Time Complexity : O[n]
Space Complexity : O[n/2]

References: //www.careercup.com/question?id=5657550909341696

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



LinkedList Class

  • Reference

Is this page helpful?

Yes No

Any additional feedback?

Feedback will be sent to Microsoft: By pressing the submit button, your feedback will be used to improve Microsoft products and services. Privacy policy.

Submit

Thank you.

Video liên quan

Bài Viết Liên Quan

Bài mới nhất

Chủ Đề