用于反转给定大小组中的链表的 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了解更多详情!