📌  相关文章
📜  通过更改链接对给定链接列表的元素进行成对交换的 C++ 程序

📅  最后修改于: 2022-05-13 01:57:45.003000             🧑  作者: Mango

通过更改链接对给定链接列表的元素进行成对交换的 C++ 程序

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

这个问题已经在这里讨论过了。那里提供的解决方案交换节点的数据。如果数据包含很多字段,就会有很多交换操作。因此,更改链接通常是一个更好的主意。以下是更改链接而不是交换数据的实现。

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 
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;
  
    // Change head before proceeding
    head = 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 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);
 
    // NOTE THIS CHANGE
    start = pairWiseSwap(start);
 
    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 
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);
 
    // NOTE THIS CHANGE
    start = pairWiseSwap(start);
 
    cout <<
    "Linked list after calling pairWiseSwap() ";
    printList(start);
 
    return 0;
}
// This code is contributed by rathbhupendra


输出:

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 循环遍历给定的链表。

辅助空间:O(1)

以下是相同方法的递归实现。我们更改前两个节点并重复剩余列表。感谢 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 
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);
 
    // NOTE THIS CHANGE
    start = pairWiseSwap(start);
 
    cout <<
    "Linked list after calling pairWiseSwap() ";
    printList(start);
 
    return 0;
}
// This code is contributed by rathbhupendra

输出:

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)

辅助空间:O(n)

请通过更改链接来参阅有关给定链接列表的成对交换元素的完整文章以获取更多详细信息!