本文概述
- 建议:在继续解决方案之前, 请先在"实践"上解决它。
- C ++
- Java
- Python3
- C#
例子:
Inputs:1->
2->
3->
4->
5->
6->
7->
8->
NULL and k = 3 Output:3->
2->
1->
6->
5->
4->
8->
7->
NULL. Inputs:1->
2->
3->
4->
5->
6->
7->
8->
NULL and k = 5Output:5->
4->
3->
2->
1->
8->
7->
6->
NULL.
推荐:请在"实践首先, 在继续解决方案之前。我们已经在下面的帖子中讨论了其解决方案
以给定大小的组反向链接列表|套装1
在本文中, 我们使用了一个堆栈, 该堆栈将存储给定链接列表的节点。首先, 将链接列表的k个元素压入堆栈。现在一个接一个地弹出元素, 并跟踪先前弹出的节点。将上一个节点的下一个指针指向堆栈的顶部元素。重复此过程, 直到达到NULL。
该算法使用O(k)额外空间。
C ++
// C++ program to reverse a linked list in groups
// of given size
#include <
bits/stdc++.h>
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<
Node*>
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 = https://www.lsbin.com/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 program to test above function*/
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 ( "\nGiven linked list \n" );
printList(head);
head = Reverse(head, 3);
printf ( "\nReversed Linked list \n" );
printList(head);
return 0;
}
Java
// Java program to reverse a linked list in groups
// of given size
import java.util.*;
class GfG
{/* Link list node */
static class Node
{
int data;
Node next;
}
static Node head = null ;
/* Reverses the linked list in groups of size k
and returns the pointer to the new head node. */
static Node Reverse(Node head, int k)
{
// Create a stack of Node*
Stack<
Node>
mystack = new Stack<
Node>
();
Node current = head;
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.peek();
head = prev;
mystack.pop();
}
else
{
prev.next = mystack.peek();
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 */
static void push( int new_data)
{
/* allocate node */
Node new_node = new Node();
/* put in the data */
new_node.data = https://www.lsbin.com/new_data;
/* link the old list off the new node */
new_node.next = head;
/* move the head to point to the new node */
head = new_node;
} /* Function to print linked list */
static void printList(Node node)
{
while (node != null )
{
System.out.print(node.data +" " );
node = node.next;
}
} /* Driver code*/
public static void main(String[] args)
{
/* Start with the empty list */
//Node head = null;
/* Created Linked list is 1->
2->
3->
4->
5->
6->
7->
8->
9 */
push( 9 );
push( 8 );
push( 7 );
push( 6 );
push( 5 );
push( 4 );
push( 3 );
push( 2 );
push( 1 );
System.out.println( "Given linked list " );
printList(head);
head = Reverse(head, 3 );
System.out.println();
System.out.println( "Reversed Linked list " );
printList(head);
}
} // This code is contributed by Prerna Saini
Python3
# Python3 program to reverse a Linked List
# in groups of given size# Node class
class Node( object ):
__slots__ = 'data' , 'next'# Constructor to initialize the node object
def __init__( self , data = https://www.lsbin.com/None , next = None ):
self .data = data
self . next = nextdef __repr__( self ):
return repr ( self .data)class LinkedList( object ):# Function to initialize head
def __init__( self ):
self .head = None# Utility function to print nodes
# of LinkedList
def __repr__( self ):
nodes = []
curr = self .head
while curr:
nodes.append( repr (curr))
curr = curr. next
return'[' + ', ' .join(nodes) + ']'# Function to insert a new node at
# the beginning
def prepend( self , data):
self .head = Node(data = https://www.lsbin.com/data, next = self .head)# Reverses the linked list in groups of size k
# and returns the pointer to the new head node.
def reverse( self , k = 1 ):
if self .head is None :
returncurr = self .head
prev = None
new_stack = []
while curr is not None :
val = 0# Terminate the loop whichever comes first
# either current == None or value >
= k
while curr is not None and val <
k:
new_stack.append(curr.data)
curr = curr. next
val + = 1# Now pop the elements of stack one by one
while new_stack:# If final list has not been started yet.
if prev is None :
prev = Node(new_stack.pop())
self .head = prev
else :
prev. next = Node(new_stack.pop())
prev = prev. next# Next of last element will point to None.
prev. next = None
return self .head# Driver Code
llist = LinkedList()
llist.prepend( 9 )
llist.prepend( 8 )
llist.prepend( 7 )
llist.prepend( 6 )
llist.prepend( 5 )
llist.prepend( 4 )
llist.prepend( 3 )
llist.prepend( 2 )
llist.prepend( 1 )print ("Given linked list" )
print (llist)
llist.head = llist.reverse( 3 )print ( "Reversed Linked list" )
print (llist)# This code is contributed by
# Sagar Kumar Sinha(sagarsinha7777)
C#
// C# program to reverse a linked list
// in groups of given size
using System;
using System.Collections;
class GfG
{ /* Link list node */
public class Node
{
public int data;
public Node next;
}
static Node head = null ;
/* Reverses the linked list in groups of size k
and returns the pointer to the new head node. */
static Node Reverse(Node head, int k)
{
// Create a stack of Node*
Stack mystack = new Stack();
Node current = head;
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.Count >
0)
{ // If final list has not been started yet.
if (prev == null )
{
prev = (Node)mystack.Peek();
head = prev;
mystack.Pop();
}
else
{
prev.next = (Node)mystack.Peek();
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 */
static void Push( int new_data)
{
/* allocate node */
Node new_node = new Node();
/* put in the data */
new_node.data = https://www.lsbin.com/new_data;
/* link the old list off the new node */
new_node.next = head;
/* move the head to point to the new node */
head = new_node;
} /* Function to print linked list */
static void printList(Node node)
{
while (node != null )
{
Console.Write(node.data +" " );
node = node.next;
}
} /* Driver code*/
public static void Main(String []args)
{
/* Start with the empty list */
//Node head = null;
/* Created Linked list is 1->
2->
3->
4->
5->
6->
7->
8->
9 */
Push( 9);
Push( 8);
Push( 7);
Push( 6);
Push( 5);
Push(4);
Push(3);
Push(2);
Push( 1);
Console.WriteLine( "Given linked list " );
printList(head);
head = Reverse(head, 3);
Console.WriteLine();
Console.WriteLine( "Reversed Linked list " );
printList(head);
}
} // This code is contributed by Arnab Kundu
输出如下:
Given Linked List1 2 3 4 5 6 7 8 9 Reversed list3 2 1 6 5 4 9 8 7
【算法设计(以给定大小的组反向链表|套装2)】如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
推荐阅读
- PHP ImagickDraw getStrokeOpacity()函数用法指南
- C#|方法重载详细介绍
- PHP | date_date_set()函数用法介绍
- Linux C编程详解(进程原理分析、文件描述符和文件记录表、文件句柄和文件原理)
- 网络工程师必备,网络基础技术相关命令详细讲解
- 网络拓扑是什么(计算机网络拓扑结构详解)
- 计算机网络简明教程(二)(网络和主机之间的通信方式是什么())
- 深入操作系统设计原理(一)(操作系统是什么(学习操作系统到底是学什么?))
- 计算机网络简明教程(一)(网络介绍和作用、因特网综合概述)