通过更改链接,成对交换给定链表的元素

给定一个单链表,编写一个函数来成对交换元素。例如,如果链表为1->2->3->4->5->6->7,则函数应将其更改为2->1->4->3->6->5->7,如果链表为1->2->3->4->5->6,则函数应将其更改为2->1->4->3->6->5

null

这个问题已经讨论过了 在这里 .提供的解决方案交换节点的数据。如果数据包含许多字段,则会有许多交换操作。所以一般来说,改变链接是个更好的主意。以下是更改链接而不是交换数据的实现。

C++

/* This program swaps the nodes of
linked list rather than swapping the
field from the nodes.
Imagine a case where a node contains
many fields, there will be plenty
of unnecessary swap calls. */
#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. It returns head of
the modified list, so return value
of this node must be assigned */
node* pairWiseSwap(node* head)
{
// If linked list is empty or
// there is only one node in list
if (head == NULL || head->next == NULL)
return head;
// Initialize previous and current pointers
node* prev = head;
node* curr = head->next;
head = curr; // Change head before proceeding
// Traverse the list
while ( true ) {
node* next = curr->next;
curr->next = prev; // Change next of
// current as previous node
// If next NULL or next is the last node
if (next == NULL || next->next == NULL) {
prev->next = next;
break ;
}
// Change next of previous to next of next
prev->next = next->next;
// Update previous and curr
prev = next;
curr = prev->next;
}
return head;
}
/* 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->6->7 */
push(&start, 7);
push(&start, 6);
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
push(&start, 1);
cout << "Linked list before "
<< "calling pairWiseSwap() " ;
printList(start);
start = pairWiseSwap(start); // NOTE THIS CHANGE
cout << "Linked list after calling"
<< "pairWiseSwap() " ;
printList(start);
return 0;
}
// This code is contributed by Manoj N


C

/* This program swaps the nodes of linked list rather than swapping the
field from the nodes.
Imagine a case where a node contains many fields, there will be plenty
of unnecessary swap calls. */
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
/* A linked list node */
struct Node {
int data;
struct Node* next;
};
/* Function to pairwise swap elements of a linked list */
void pairWiseSwap( struct Node** head)
{
// If linked list is empty or there is only one node in list
if (*head == NULL || (*head)->next == NULL)
return ;
// Initialize previous and current pointers
struct Node* prev = *head;
struct Node* curr = (*head)->next;
*head = curr; // Change head before proceeding
// Traverse the list
while ( true ) {
struct Node* next = curr->next;
curr->next = prev; // Change next of current as previous node
// If next NULL or next is the last node
if (next == NULL || next->next == NULL) {
prev->next = next;
break ;
}
// Change next of previous to next next
prev->next = next->next;
// Update previous and curr
prev = next;
curr = prev->next;
}
}
/* 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->6->7 */
push(&start, 7);
push(&start, 6);
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
push(&start, 1);
printf ( " Linked list before calling  pairWiseSwap() " );
printList(start);
pairWiseSwap(&start);
printf ( " Linked list after calling  pairWiseSwap() " );
printList(start);
getchar ();
return 0;
}


JAVA

// Java program to swap elements of linked list by changing links
class LinkedList {
static Node head;
static class Node {
int data;
Node next;
Node( int d)
{
data = d;
next = null ;
}
}
/* Function to pairwise swap elements of a linked list */
Node pairWiseSwap(Node node)
{
// If linked list is empty or there is only one node in list
if (node == null || node.next == null ) {
return node;
}
// Initialize previous and current pointers
Node prev = node;
Node curr = node.next;
node = curr; // Change head before proceeding
// Traverse the list
while ( true ) {
Node next = curr.next;
curr.next = prev; // Change next of current as previous node
// If next NULL or next is the last node
if (next == null || next.next == null ) {
prev.next = next;
break ;
}
// Change next of previous to next next
prev.next = next.next;
// Update previous and curr
prev = next;
curr = prev.next;
}
return node;
}
/* Function to print nodes in a given linked list */
void printList(Node node)
{
while (node != null ) {
System.out.print(node.data + " " );
node = node.next;
}
}
// Driver program to test above functions
public static void main(String[] args)
{
/* The constructed linked list is:
1->2->3->4->5->6->7 */
LinkedList list = new LinkedList();
list.head = new Node( 1 );
list.head.next = new Node( 2 );
list.head.next.next = new Node( 3 );
list.head.next.next.next = new Node( 4 );
list.head.next.next.next.next = new Node( 5 );
list.head.next.next.next.next.next = new Node( 6 );
list.head.next.next.next.next.next.next = new Node( 7 );
System.out.println( "Linked list before calling pairwiseSwap() " );
list.printList(head);
Node st = list.pairWiseSwap(head);
System.out.println( "" );
System.out.println( "Linked list after calling pairwiseSwap() " );
list.printList(st);
System.out.println( "" );
}
}
// This code has been contributed by Mayank Jaiswal


Python3

# Python3 program to swap elements of
# linked list by changing links
# Linked List Node
class Node:
def __init__( self , data):
self .data = data
self . next = None
# Create and Handle list operations
class LinkedList:
def __init__( self ):
# Head of list
self .head = None
# Add data to list
def addToList( self , data):
newNode = Node(data)
if self .head is None :
self .head = newNode
return
last = self .head
while last. next :
last = last. next
last. next = newNode
# Function to print nodes
# in a given linked list
def __str__( self ):
linkedListStr = ""
temp = self .head
while temp:
linkedListStr = (linkedListStr +
str (temp.data) + " " )
temp = temp. next
return linkedListStr
# Function to pairwise swap elements
# of a linked list. It returns head of
# the modified list, so return value
# of this node must be assigned
def pairWiseSwap( self ):
# If list is empty or with one node
if ( self .head is None or
self .head. next is None ):
return
# Initialize previous and current pointers
prevNode = self .head
currNode = self .head. next
# Change head node
self .head = currNode
# Traverse the list
while True :
nextNode = currNode. next
# Change next of current
# node to previous node
currNode. next = prevNode
# If next node is the last node
if nextNode. next is None :
prevNode. next = nextNode
break
# Change next of previous to
# next of next
prevNode. next = nextNode. next
# Update previous and current nodes
prevNode = nextNode
currNode = prevNode. next
# Driver Code
linkedList = LinkedList()
linkedList.addToList( 1 )
linkedList.addToList( 2 )
linkedList.addToList( 3 )
linkedList.addToList( 4 )
linkedList.addToList( 5 )
linkedList.addToList( 6 )
linkedList.addToList( 7 )
print ( "Linked list before calling"
"pairwiseSwap() " ,
linkedList)
linkedList.pairWiseSwap()
print ( "Linked list after calling "
"pairwiseSwap() " ,
linkedList)
# This code is contributed by AmiyaRanjanRout


C#

// C# program to swap elements of
// linked list by changing links
using System;
public class LinkedList {
Node head;
public class Node {
public int data;
public Node next;
public Node( int d)
{
data = d;
next = null ;
}
}
/* Function to pairwise swap
elements of a linked list */
Node pairWiseSwap(Node node)
{
// If linked list is empty or there
// is only one node in list
if (node == null || node.next == null ) {
return node;
}
// Initialize previous and current pointers
Node prev = node;
Node curr = node.next;
// Change head before proceeeding
node = curr;
// Traverse the list
while ( true ) {
Node next = curr.next;
// Change next of current as previous node
curr.next = prev;
// If next NULL or next is the last node
if (next == null || next.next == null ) {
prev.next = next;
break ;
}
// Change next of previous to next of next
prev.next = next.next;
// Update previous and curr
prev = next;
curr = prev.next;
}
return node;
}
/* Function to print nodes
in a given linked list */
void printList(Node node)
{
while (node != null ) {
Console.Write(node.data + " " );
node = node.next;
}
}
// Driver code
public static void Main(String[] args)
{
/* The constructed linked list is:
1->2->3->4->5->6->7 */
LinkedList list = new LinkedList();
list.head = new Node(1);
list.head.next = new Node(2);
list.head.next.next = new Node(3);
list.head.next.next.next = new Node(4);
list.head.next.next.next.next = new Node(5);
list.head.next.next.next.next.next = new Node(6);
list.head.next.next.next.next.next.next = new Node(7);
Console.WriteLine( "Linked list before calling pairwiseSwap() " );
list.printList(list.head);
Node st = list.pairWiseSwap(list.head);
Console.WriteLine( "" );
Console.WriteLine( "Linked list after calling pairwiseSwap() " );
list.printList(st);
Console.WriteLine( "" );
}
}
// This code contributed by Rajput-Ji


Javascript

<script>
// javascript program to swap elements of linked list by changing links
var head;
class Node {
constructor(val) {
this .data = val;
this .next = null ;
}
}
/* Function to pairwise swap elements of a linked list */
function pairWiseSwap(node) {
// If linked list is empty or there is only one node in list
if (node == null || node.next == null ) {
return node;
}
// Initialize previous and current pointers
var prev = node;
var curr = node.next;
node = curr; // Change head before proceeding
// Traverse the list
while ( true ) {
var next = curr.next;
curr.next = prev; // Change next of current as previous node
// If next NULL or next is the last node
if (next == null || next.next == null ) {
prev.next = next;
break ;
}
// Change next of previous to next next
prev.next = next.next;
// Update previous and curr
prev = next;
curr = prev.next;
}
return node;
}
/* Function to print nodes in a given linked list */
function printList(node) {
while (node != null ) {
document.write(node.data + " " );
node = node.next;
}
}
// Driver program to test above functions
/*
* The constructed linked list is: 1->2->3->4->5->6->7
*/
head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
head.next.next.next.next.next = new Node(6);
head.next.next.next.next.next.next = new Node(7);
document.write( "Linked list before calling pairwiseSwap() " );
printList(head);
var st = pairWiseSwap(head);
document.write( "<br/>" );
document.write( "Linked list after calling pairwiseSwap() " );
printList(st);
document.write( "" );
// This code contributed by aashish1995
</script>


输出:

 Linked list before calling  pairWiseSwap() 1 2 3 4 5 6 7 Linked list after calling  pairWiseSwap() 2 1 4 3 6 5 7

时间复杂性: 上述程序的时间复杂度为O(n),其中n是给定链表中的节点数。while循环遍历给定的链表。

以下是 递归实现 同样的方法。我们更改前两个节点,然后重复执行剩余的列表。感谢geek和omer salem提出了这种方法。

C++

/* This program swaps the nodes of linked list rather than swapping the
field from the nodes.
Imagine a case where a node contains many fields, there will be plenty
of unnecessary swap calls. */
#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.
It returns head of the modified list, so return value
of this node must be assigned */
node* pairWiseSwap(node* head)
{
// Base Case: The list is empty or has only one node
if (head == NULL || head->next == NULL)
return head;
// Store head of list after two nodes
node* remaining = head->next->next;
// Change head
node* newhead = head->next;
// Change next of second node
head->next->next = head;
// Recur for remaining list and change next of head
head->next = pairWiseSwap(remaining);
// Return new head of modified list
return newhead;
}
/* 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 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 << "Linked list before calling pairWiseSwap() " ;
printList(start);
start = pairWiseSwap(start); // NOTE THIS CHANGE
cout << "Linked list after calling pairWiseSwap() " ;
printList(start);
return 0;
}
// This is code is contributed by rathbhupendra


C

/* This program swaps the nodes of linked list rather than swapping the
field from the nodes.
Imagine a case where a node contains many fields, there will be plenty
of unnecessary swap calls. */
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
/* A linked list node */
struct node {
int data;
struct node* next;
};
/* Function to pairwise swap elements of a linked list.
It returns head of the modified list, so return value
of this node must be assigned */
struct node* pairWiseSwap( struct node* head)
{
// Base Case: The list is empty or has only one node
if (head == NULL || head->next == NULL)
return head;
// Store head of list after two nodes
struct node* remaining = head->next->next;
// Change head
struct node* newhead = head->next;
// Change next of second node
head->next->next = head;
// Recur for remaining list and change next of head
head->next = pairWiseSwap(remaining);
// Return new head of modified list
return newhead;
}
/* 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->6->7 */
push(&start, 7);
push(&start, 6);
push(&start, 5);
push(&start, 4);
push(&start, 3);
push(&start, 2);
push(&start, 1);
printf ( " Linked list before calling  pairWiseSwap() " );
printList(start);
start = pairWiseSwap(start); // NOTE THIS CHANGE
printf ( " Linked list after calling  pairWiseSwap() " );
printList(start);
return 0;
}


JAVA

// Java program to swap elements of linked list by changing links
class LinkedList {
static Node head;
static class Node {
int data;
Node next;
Node( int d)
{
data = d;
next = null ;
}
}
/* Function to pairwise swap elements of a linked list.
It returns head of the modified list, so return value
of this node must be assigned */
Node pairWiseSwap(Node node)
{
// Base Case: The list is empty or has only one node
if (node == null || node.next == null ) {
return node;
}
// Store head of list after two nodes
Node remaining = node.next.next;
// Change head
Node newhead = node.next;
// Change next of second node
node.next.next = node;
// Recur for remaining list and change next of head
node.next = pairWiseSwap(remaining);
// Return new head of modified list
return newhead;
}
/* Function to print nodes in a given linked list */
void printList(Node node)
{
while (node != null ) {
System.out.print(node.data + " " );
node = node.next;
}
}
// Driver program to test above functions
public static void main(String[] args)
{
/* The constructed linked list is:
1->2->3->4->5->6->7 */
LinkedList list = new LinkedList();
list.head = new Node( 1 );
list.head.next = new Node( 2 );
list.head.next.next = new Node( 3 );
list.head.next.next.next = new Node( 4 );
list.head.next.next.next.next = new Node( 5 );
list.head.next.next.next.next.next = new Node( 6 );
list.head.next.next.next.next.next.next = new Node( 7 );
System.out.println( "Linked list before calling pairwiseSwap() " );
list.printList(head);
head = list.pairWiseSwap(head);
System.out.println( "" );
System.out.println( "Linked list after calling pairwiseSwap() " );
list.printList(head);
System.out.println( "" );
}
}


Python3

# Python3 program to pairwise swap
# linked list using recursive method
# Linked List Node
class Node:
def __init__( self , data):
self .data = data
self . next = None
# Create and Handle list operations
class LinkedList:
def __init__( self ):
# Head of list
self .head = None
# Add data to list
def addToList( self , data):
newNode = Node(data)
if self .head is None :
self .head = newNode
return
last = self .head
while last. next :
last = last. next
last. next = newNode
# Function to print nodes in
# a given linked list
def __str__( self ):
linkedListStr = ""
temp = self .head
while temp:
linkedListStr = (linkedListStr +
str (temp.data) + " " )
temp = temp. next
return linkedListStr
# Function to pairwise swap elements of
# a linked list.It returns head of the
# modified list, so return value
# of this node must be assigned
def pairWiseSwap( self , node):
# If list is empty or with one node
if node is None or node. next is None :
return node
# Store head of list after 2 nodes
remaining = node. next . next
# Change head
newHead = node. next
# Change next to second node
node. next . next = node
# Recur for remaining list and
# change next of head
node. next = self .pairWiseSwap(remaining)
# Return new head of modified list
return newHead
# Driver Code
linkedList = LinkedList()
linkedList.addToList( 1 )
linkedList.addToList( 2 )
linkedList.addToList( 3 )
linkedList.addToList( 4 )
linkedList.addToList( 5 )
linkedList.addToList( 6 )
linkedList.addToList( 7 )
print ( "Linked list before calling "
"pairwiseSwap() " , linkedList)
linkedList.head = linkedList.pairWiseSwap(
linkedList.head)
print ( "Linked list after calling "
"pairwiseSwap() " , linkedList)
# This code is contributed by AmiyaRanjanRout


C#

// C# program to swap elements
// of linked list by changing links
using System;
public class LinkedList {
Node head;
class Node {
public int data;
public Node next;
public Node( int d)
{
data = d;
next = null ;
}
}
/* Function to pairwise swap
elements of a linked list.
It returns head of the modified
list, so return value of this
node must be assigned */
Node pairWiseSwap(Node node)
{
// Base Case: The list is empty
// or has only one node
if (node == null || node.next == null ) {
return node;
}
// Store head of list after two nodes
Node remaining = node.next.next;
// Change head
Node newhead = node.next;
// Change next of second node
node.next.next = node;
// Recur for remaining list
// and change next of head
node.next = pairWiseSwap(remaining);
// Return new head of modified list
return newhead;
}
/* Function to print nodes in a given linked list */
void printList(Node node)
{
while (node != null ) {
Console.Write(node.data + " " );
node = node.next;
}
}
// Driver program to test above functions
public static void Main()
{
/* The constructed linked list is:
1->2->3->4->5->6->7 */
LinkedList list = new LinkedList();
list.head = new Node(1);
list.head.next = new Node(2);
list.head.next.next = new Node(3);
list.head.next.next.next = new Node(4);
list.head.next.next.next.next = new Node(5);
list.head.next.next.next.next.next = new Node(6);
list.head.next.next.next.next.next.next = new Node(7);
Console.WriteLine( "Linked list before calling pairwiseSwap() " );
list.printList(list.head);
list.head = list.pairWiseSwap(list.head);
Console.WriteLine( "" );
Console.WriteLine( "Linked list after calling pairwiseSwap() " );
list.printList(list.head);
Console.WriteLine( "" );
}
}
// This code is contributed by PrinciRaj1992


Javascript

<script>
// javascript program to swap elements of linked list by changing links
var head;
class Node {
constructor(val) {
this .data = val;
this .next = null ;
}
}
/*
* Function to pairwise swap elements of a linked  It returns head of the
* modified list, so return value of this node must be assigned
*/
function pairWiseSwap(node) {
// Base Case: The list is empty or has only one node
if (node == null || node.next == null ) {
return node;
}
// Store head of list after two nodes
var remaining = node.next.next;
// Change head
var newhead = node.next;
// Change next of second node
node.next.next = node;
// Recur for remaining list and change next of head
node.next = pairWiseSwap(remaining);
// Return new head of modified list
return newhead;
}
/* Function to print nodes in a given linked list */
function printList(node) {
while (node != null ) {
document.write(node.data + " " );
node = node.next;
}
}
// Driver program to test above functions
/*
* The constructed linked list is: 1->2->3->4->5->6->7
*/
head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
head.next.next.next.next.next = new Node(6);
head.next.next.next.next.next.next = new Node(7);
document.write( "Linked list before calling pairwiseSwap() " );
printList(head);
head = pairWiseSwap(head);
document.write( "<br/>" );
document.write( "Linked list after calling pairwiseSwap() " );
printList(head);
document.write( "" );
// This code contributed by umadevi9616
</script>


输出:

 Linked list before calling  pairWiseSwap() 1 2 3 4 5 6 7 Linked list after calling  pairWiseSwap() 2 1 4 3 6 5 7

通过改变指针|集2,成对交换链表的相邻节点 本文由 乔塔姆·库马尔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享