给定一个单链表, 编写一个函数以成对替换元素。例如, 如果链接列表是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

这个问题曾经在lsbin((https://www.lsbin.com/tag/%e7%ae%97%e6%b3%95%e9%a2%98/)中探讨过了,那里提供的解决方案替换节点数据。如果数据蕴含许多字段, 将有许多替换操作。因而, 通常更改链接是一个更好的主见。以下是一个C实现, 它更改了链接而不是替换数据。

C ++

/* This program swaps the nodes oflinked list rather than swapping thefield from the nodes.Imagine a case where a node containsmany fields, there will be plentyof 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 elementsof a linked list. It returns head ofthe modified list, so return valueof 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 proceeeding       // 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 head;} /* Function to add a node atthe begining 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 nodesin 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 << "nLinked 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 thefield from the nodes.Imagine a case where a node contains many fields, there will be plentyof 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 proceeeding      // 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 begining 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;     }} /* Druver 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  pairWiseSwap() " );     printList(start);      pairWiseSwap(&start);      printf ( "n 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 proceeeding          // 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

C

// C# program to swap elements of// linked list by changing linksusing 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 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

输入如下: 

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 thefield from the nodes.Imagine a case where a node contains many fields, there will be plentyof 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 valueof 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* remaing = 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(remaing);      // Return new head of modified list     return newhead;} /* Function to add a node at the begining 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;     }} /* Druver 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 << "nLinked 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 thefield from the nodes.Imagine a case where a node contains many fields, there will be plentyof 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* remaing = 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(remaing);      // Return new head of modified list     return newhead;} /* Function to add a node at the begining 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;     }} /* Druver 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  pairWiseSwap() " );     printList(start);      start = pairWiseSwap(start); // NOTE THIS CHANGE      printf ( "n 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 remaing = 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(remaing);          // 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( "" );     }}

C

// C# program to swap elements// of linked list by changing linksusing 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 remaing = 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(remaing);          // 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

输入如下: 

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

如果发现任何不正确的中央, 或者想分享无关上述主题的更多信息, 请发表评论。

更多数据结构和算法相干内容请参考:lsbin - IT开发技术:https://www.lsbin.com/

查看以下更多算法相干的内容:

  • 给定矩阵的所有行中的公共元素:https://www.lsbin.com/3695.html
  • 如何计算两个数组中的最大求和门路?:https://www.lsbin.com/3689.html
  • 算法题:将第一个元素加倍,而后将零挪动到结尾:https://www.lsbin.com/3542.html