Dada una lista enlazada individualmente, escriba una función para intercambiar elementos por pares.
Entrada: 1->2->3->4->5->6->NULO
Salida: 2->1->4->3->6->5->NULOEntrada: 1->2->3->4->5->NULO
Salida: 2->1->4->3->5->NULOEntrada: 1->NULO
Salida: 1->NULOPor ejemplo, si la lista enlazada es 1->2->3->4->5 entonces la función debería cambiarla a 2->1->4->3->5, y si la lista enlazada es entonces el la función debería cambiarlo a.
MÉTODO 1 (Iterativo)
Comience desde el Node principal y recorra la lista. Al atravesar los datos de intercambio de cada Node con los datos de su siguiente Node.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to pairwise swap elements
// in a given linked list
#include <bits/stdc++.h>
using
namespace
std;
/* A linked list node */
class
Node {
public
:
int
data;
Node* next;
};
/* Function to pairwise swap elements
of a linked list */
void
pairWiseSwap(Node* head)
{
Node* temp = head;
/* Traverse further only if
there are at-least two nodes left */
while
(temp != NULL && temp->next != NULL) {
/* Swap data of node with
its next node's data */
swap(temp->data,
temp->next->data);
/* Move temp by 2 for the next pair */
temp = temp->next->next;
}
}
/* Function to add a node at the
beginning of Linked 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 << node->data <<
" "
;
node = node->next;
}
}
// Driver Code
int
main()
{
Node* start = NULL;
/* The constructed linked list is:
1->2->3->4->5 */
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
push(&start, 1);
cout <<
"Linked list "
<<
"before calling pairWiseSwap()\n"
;
printList(start);
pairWiseSwap(start);
cout <<
"\nLinked list "
<<
"after calling pairWiseSwap()\n"
;
printList(start);
return
0;
}
// This code is contributed
// by rathbhupendra
C
/* C program to pairwise swap elements in a given linked list */
#include <stdio.h>
#include <stdlib.h>
/* A linked list node */
struct
Node {
int
data;
struct
Node* next;
};
/*Function to swap two integers at addresses a and b */
void
swap(
int
* a,
int
* b);
/* Function to pairwise swap elements of a linked list */
void
pairWiseSwap(
struct
Node* head)
{
struct
Node* temp = head;
/* Traverse further only if there are at-least two nodes left */
while
(temp != NULL && temp->next != NULL) {
/* Swap data of node with its next node's data */
swap(&temp->data, &temp->next->data);
/* Move temp by 2 for the next pair */
temp = temp->next->next;
}
}
/* UTILITY FUNCTIONS */
/* Function to swap two integers */
void
swap(
int
* a,
int
* b)
{
int
temp;
temp = *a;
*a = *b;
*b = temp;
}
/* Function to add a node at the beginning of 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 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 */
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
push(&start, 1);
printf
(
"Linked list before calling pairWiseSwap()\n"
);
printList(start);
pairWiseSwap(start);
printf
(
"\nLinked list after calling pairWiseSwap()\n"
);
printList(start);
return
0;
}
Java
// Java program to pairwise swap elements of a linked list
class
LinkedList {
Node head;
// head of list
/* Linked list Node*/
class
Node {
int
data;
Node next;
Node(
int
d)
{
data = d;
next =
null
;
}
}
void
pairWiseSwap()
{
Node temp = head;
/* Traverse only till there are atleast 2 nodes left */
while
(temp !=
null
&& temp.next !=
null
) {
/* Swap the data */
int
k = temp.data;
temp.data = temp.next.data;
temp.next.data = k;
temp = temp.next.next;
}
}
/* Utility functions */
/* Inserts a new Node at front of the list. */
public
void
push(
int
new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node =
new
Node(new_data);
/* 3. Make next of new Node as head */
new_node.next = head;
/* 4. Move the head to point to new Node */
head = new_node;
}
/* Function to print linked list */
void
printList()
{
Node temp = head;
while
(temp !=
null
) {
System.out.print(temp.data +
" "
);
temp = temp.next;
}
System.out.println();
}
/* Driver program to test above functions */
public
static
void
main(String args[])
{
LinkedList llist =
new
LinkedList();
/* Created Linked List 1->2->3->4->5 */
llist.push(
5
);
llist.push(
4
);
llist.push(
3
);
llist.push(
2
);
llist.push(
1
);
System.out.println(
"Linked List before calling pairWiseSwap() "
);
llist.printList();
llist.pairWiseSwap();
System.out.println(
"Linked List after calling pairWiseSwap() "
);
llist.printList();
}
}
/* This code is contributed by Rajat Mishra */
Python
# Python program to swap the elements of linked list pairwise
# Node class
class
Node:
# Constructor to initialize the node object
def
__init__(
self
, data):
self
.data
=
data
self
.
next
=
None
class
LinkedList:
# Function to initialize head
def
__init__(
self
):
self
.head
=
None
# Function to pairwise swap elements of a linked list
def
pairwiseSwap(
self
):
temp
=
self
.head
# There are no nodes in linked list
if
temp
is
None
:
return
# Traverse furthethr only if there are at least two
# left
while
(temp
and
temp.
next
):
# If both nodes are same,
# no need to swap data
if
(temp.data !
=
temp.
next
.data):
# Swap data of node with its next node's data
temp.data, temp.
next
.data
=
temp.
next
.data, temp.data
# Move temp by 2 to the next pair
temp
=
temp.
next
.
next
# Function to insert a new node at the beginning
def
push(
self
, new_data):
new_node
=
Node(new_data)
new_node.
next
=
self
.head
self
.head
=
new_node
# Utility function to print the linked LinkedList
def
printList(
self
):
temp
=
self
.head
while
(temp):
temp.data,
temp
=
temp.
next
# Driver program
llist
=
LinkedList()
llist.push(
5
)
llist.push(
4
)
llist.push(
3
)
llist.push(
2
)
llist.push(
1
)
"Linked list before calling pairWiseSwap() "
llist.printList()
llist.pairwiseSwap()
"\nLinked list after calling pairWiseSwap()"
llist.printList()
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)
C#
// C# program to pairwise swap elements of a linked list
using
System;
class
LinkedList {
Node head;
// head of list
/* Linked list Node*/
public
class
Node {
public
int
data;
public
Node next;
public
Node(
int
d)
{
data = d;
next =
null
;
}
}
void
pairWiseSwap()
{
Node temp = head;
/* Traverse only till there are atleast 2 nodes left */
while
(temp !=
null
&& temp.next !=
null
) {
/* Swap the data */
int
k = temp.data;
temp.data = temp.next.data;
temp.next.data = k;
temp = temp.next.next;
}
}
/* Utility functions */
/* Inserts a new Node at front of the list. */
public
void
push(
int
new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node =
new
Node(new_data);
/* 3. Make next of new Node as head */
new_node.next = head;
/* 4. Move the head to point to new Node */
head = new_node;
}
/* Function to print linked list */
void
printList()
{
Node temp = head;
while
(temp !=
null
) {
Console.Write(temp.data +
" "
);
temp = temp.next;
}
Console.WriteLine();
}
/* Driver program to test above functions */
public
static
void
Main(String[] args)
{
LinkedList llist =
new
LinkedList();
/* Created Linked List 1->2->3->4->5 */
llist.push(5);
llist.push(4);
llist.push(3);
llist.push(2);
llist.push(1);
Console.WriteLine(
"Linked List before calling pairWiseSwap() "
);
llist.printList();
llist.pairWiseSwap();
Console.WriteLine(
"Linked List after calling pairWiseSwap() "
);
llist.printList();
}
}
// This code is contributed by Arnab Kundu
JavaScript
<script>
// JavaScript program to pairwise swap
// elements of a linked list
var
head;
// head of list
/* Linked list Node */
class Node {
constructor(val) {
this
.data = val;
this
.next =
null
;
}
}
function
pairWiseSwap() {
var
temp = head;
/* Traverse only till there are
atleast 2 nodes left */
while
(temp !=
null
&& temp.next !=
null
) {
/* Swap the data */
var
k = temp.data;
temp.data = temp.next.data;
temp.next.data = k;
temp = temp.next.next;
}
}
/* Utility functions */
/* Inserts a new Node at front of the list. */
function
push(new_data) {
/*
* 1 & 2: Allocate the Node & Put in the data
*/
var
new_node =
new
Node(new_data);
/* 3. Make next of new Node as head */
new_node.next = head;
/* 4. Move the head to point to new Node */
head = new_node;
}
/* Function to print linked list */
function
printList() {
var
temp = head;
while
(temp !=
null
) {
document.write(temp.data +
" "
);
temp = temp.next;
}
document.write(
"<br/>"
);
}
/* Driver program to test above functions */
/* Created Linked List 1->2->3->4->5 */
push(5);
push(4);
push(3);
push(2);
push(1);
document.write(
"Linked List before calling pairWiseSwap() <br/>"
);
printList();
pairWiseSwap();
document.write(
"Linked List after calling pairWiseSwap()<br/> "
);
printList();
// This code is contributed by todaysgaurav
</script>
ProducciónLinked list before calling pairWiseSwap() 1 2 3 4 5 Linked list after calling pairWiseSwap() 2 1 4 3 5Complejidad del tiempo: O(N)
A medida que recorremos la lista enlazada solo una vez.
Espacio Auxiliar: O(1)
Como espacio adicional constante se utiliza.
MÉTODO 2 (Recursivo)
Si hay 2 o más de 2 Nodes en la lista enlazada, intercambie los dos primeros Nodes y llame recursivamente al resto de la lista.La imagen de abajo es una ejecución en seco del enfoque anterior:
A continuación se muestra la implementación del enfoque anterior:
C++
/* Recursive function to pairwise swap elements
of a linked list */
void
pairWiseSwap(node* head)
{
/* There must be at-least two nodes in the list */
if
(head != NULL && head->next != NULL) {
/* Swap the node's data with data of next node */
swap(head->data, head->next->data);
/* Call pairWiseSwap() for rest of the list */
pairWiseSwap(head->next->next);
}
}
// The code is contributed by Gautam goel (gautamgoel962)
C
/* Recursive function to pairwise swap elements
of a linked list */
void
pairWiseSwap(
struct
node* head)
{
/* There must be at-least two nodes in the list */
if
(head != NULL && head->next != NULL) {
/* Swap the node's data with data of next node */
swap(head->data, head->next->data);
/* Call pairWiseSwap() for rest of the list */
pairWiseSwap(head->next->next);
}
}
Java
/* Recursive function to pairwise swap elements
of a linked list */
static
void
pairWiseSwap(node head)
{
/* There must be at-least two nodes in the list */
if
(head !=
null
&& head.next !=
null
) {
/* Swap the node's data with data of next node */
swap(head.data, head.next.data);
/* Call pairWiseSwap() for rest of the list */
pairWiseSwap(head.next.next);
}
}
// This code contributed by aashish1995
Python3
# Recursive function to pairwise swap elements of a linked list
def
pairWiseSwap(head):
# There must be at-least two nodes in the list
if
(head !
=
None
and
head.
next
!
=
None
):
# Swap the node's data with data of next node
swap(head.data, head.
next
.data);
# Call pairWiseSwap() for rest of the list
pairWiseSwap(head.
next
.
next
);
# This code is contributed by _saurabh_jaiswal
C#
/* Recursive function to pairwise swap elements
of a linked list */
static
void
pairWiseSwap(node head)
{
/* There must be at-least two nodes in the list */
if
(head !=
null
&& head.next !=
null
) {
/* Swap the node's data with data of next node */
swap(head.data, head.next.data);
/* Call pairWiseSwap() for rest of the list */
pairWiseSwap(head.next.next);
}
}
// This code contributed by aashish1995
JavaScript
<script>
/* Recursive function to pairwise swap elements
of a linked list */
function
pairWiseSwap(head)
{
/* There must be at-least two nodes in the list */
if
(head !=
null
&& head.next !=
null
) {
/* Swap the node's data with data of next node */
swap(head.data, head.next.data);
/* Call pairWiseSwap() for rest of the list */
pairWiseSwap(head.next.next);
}
}
// This code is contributed by avanitrachhadiya2155
</script>
Complejidad temporal: O(n)
Espacio Auxiliar: O(1)
Como es una función recursiva de cola, la pila de llamadas de función no se construiría y, por lo tanto, no se usará espacio adicional.
La solución provista aquí intercambia datos de Nodes. Si los datos contienen muchos campos (por ejemplo, una lista enlazada de Objetos de Estudiante), la operación de intercambio será costosa. Consulte el siguiente artículo para obtener una mejor solución que funcione bien para todo tipo de listas vinculadas
Intercambiar Nodes por parejas cambiando enlaces
Escriba comentarios si encuentra algún error en el código/algoritmo anterior, o encuentre otras formas de resolver el mismo problema.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA