📌  相关文章
📜  用于反转给定大小组中的链表的 C++ 程序 – 第 2 组

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

用于反转给定大小组中的链表的 C++ 程序 – 第 2 组

给定一个链表,编写一个函数来反转每 k 个节点(其中 k 是函数的输入)。
例子:

Input: 1->2->3->4->5->6->7->8->NULL and k = 3 
Output: 3->2->1->6->5->4->8->7->NULL. 

Input: 1->2->3->4->5->6->7->8->NULL and k = 5
Output: 5->4->3->2->1->8->7->6->NULL.

我们已经在下面的帖子中讨论了它的解决方案
在给定大小的组中反转链接列表 |设置 1
在这篇文章中,我们使用了一个堆栈来存储给定链表的节点。首先,将链表的 k 个元素压入栈中。现在一个一个地弹出元素并跟踪之前弹出的节点。将 prev 节点的 next 指针指向栈顶元素。重复此过程,直到达到 NULL。
该算法使用 O(k) 额外空间。

C++
// C++ program to reverse a linked list 
// in groups of given size
#include 
using namespace std;
  
// Link list node
struct Node 
{
    int data;
    struct Node* next;
};
  
/* Reverses the linked list in groups 
   of size k and returns the pointer 
   to the new head node. */
struct Node* Reverse(struct Node* head, 
                     int k)
{
    // Create a stack of Node*
    stack mystack;
    struct Node* current = head;
    struct Node* prev = NULL;
  
    while (current != NULL) 
    {
        // Terminate the loop whichever 
        // comes first either current == NULL 
        // or count >= k
        int count = 0;
        while (current != NULL && 
               count < k) 
        {
            mystack.push(current);
            current = current->next;
            count++;
        }
  
        // Now pop the elements of stack 
        // one by one
        while (mystack.size() > 0) 
        {
            // If final list has not been 
            // started yet.
            if (prev == NULL) 
            {
                prev = mystack.top();
                head = prev;
                mystack.pop();
            } 
            else 
            {
                prev->next = mystack.top();
                prev = prev->next;
                mystack.pop();
            }
        }
    }
  
    // Next of last element will 
    // point to NULL.
    prev->next = NULL;
  
    return head;
}
  
// UTILITY FUNCTIONS
// Function to push a node
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 linked list
void printList(struct Node* node)
{
    while (node != NULL) 
    {
        printf("%d  ", node->data);
        node = node->next;
    }
}
  
// Driver code
int main(void)
{
    // Start with the empty list
    struct Node* head = NULL;
  
    // Created Linked list is 
    // 1->2->3->4->5->6->7->8->9 
    push(&head, 9);
    push(&head, 8);
    push(&head, 7);
    push(&head, 6);
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
  
    printf("Given linked list ");
    printList(head);
    head = Reverse(head, 3);
  
    printf("Reversed Linked list ");
    printList(head);
  
    return 0;
}


输出:

Given Linked List
1 2 3 4 5 6 7 8 9 
Reversed list
3 2 1 6 5 4 9 8 7

请参阅完整的文章在给定大小的组中反转链接列表 |设置2了解更多详情!