在不影响特殊字符的情况下反转链表的节点

给出一个字母表和特殊字符的链表。在不影响特殊字符位置的情况下反转给定的链表。

null

例如:

输入 :g->@->e->#->e->$->k->s->NULL 输出 :s->@->k->#->e->$->e->g->NULL 解释 :这里我们可以看到,在输出中,特殊字符在“不改变”和“链表”中的位置是相反的。

其思想是遍历链表,并将不包括特殊字符的字符存储在临时数组中。再次遍历链表,并以相反的方式将元素从数组复制到链表的节点。

下面是一步一步的算法 :

  1. 拿一个临时数组,TEMP_ARR。
  2. 遍历链表并执行以下操作
    • 如果当前元素是字母表,则将链接列表中的该元素存储到TEMP_ARR。
    • 否则,将节点指针增加1
  3. 再次从头部和末端遍历链表,并执行以下操作:
    • 如果当前元素是字母表,则将TEMP_ARR的最后一个元素复制到当前链表节点,并为下一次迭代减少TEMP_ARR的当前索引。
    • 否则,增加一个节点

以下是上述方法的实施情况:

C++

// C++ program to reverse a linked list
// without affecting special characters
#include <iostream>
using namespace std;
// Link list node
struct Node {
char data;
struct Node* next;
};
// Function to reverse the linked list
// without affecting special characters
void reverse( struct Node** head_ref, int size)
{
struct Node* current = *head_ref;
char TEMP_ARR[size];
int i = 0;
// Traverse the linked list and insert
// linked list elements to TEMP_ARR
while (current != NULL) {
// if the current data is any alphabet than
// store it in to TEMP_ARR
if ((current->data >= 97 && current->data <= 122) ||
(current->data >= 65 && current->data <= 90)) {
TEMP_ARR[i++] = current->data;
current = current->next;
}
// else increase the node position
else
current = current->next;
}
current = *head_ref;
// Traverse the linked list again
while (current != NULL)
{
// if current character is an alphabet than
// replace the current element in the linked list
// with the last element of the TEMP_ARR
if ((current->data >= 97 && current->data <= 122) ||
(current->data >= 65 && current->data <= 90)) {
current->data = TEMP_ARR[--i];
current = current->next;
}
// else increase the node
else
current = current->next;
}
}
// Function to push a node
void push( struct Node** head_ref, char new_data)
{
/* allocate node */
struct 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 linked list */
void printList( struct Node* head)
{
struct Node* temp = head;
while (temp != NULL) {
cout << temp->data;
temp = temp->next;
}
}
// Driver program to test above function
int main()
{
/* Start with the empty list */
struct Node* head = NULL;
push(&head, 's' );
push(&head, '$' );
push(&head, 'k' );
push(&head, 'e' );
push(&head, 'e' );
push(&head, '@' );
push(&head, '#' );
push(&head, 'g' );
push(&head, 'r' );
push(&head, 'o' );
push(&head, 'f' );
push(&head, 's' );
push(&head, '$' );
push(&head, 'k' );
push(&head, 'e' );
push(&head, 'e' );
push(&head, 'g' );
cout << "Given linked list: " ;
printList(head);
reverse(&head, 13);
cout << "Reversed Linked list: " ;
printList(head);
return 0;
}


JAVA

// Java program to reverse a
// linked list without affecting
// special characters
class GFG
{
// Link list node
public static class Node
{
char data;
Node next;
}
// Function to reverse the linked
// list without affecting special
// characters
static void reverse(Node head_ref,
int size)
{
Node current = head_ref;
char TEMP_ARR[] = new char [size];
int i = 0 ;
// Traverse the linked list
// and insert linked list
// elements to TEMP_ARR
while (current != null )
{
// if the current data
// is any alphabet than
// store it in to TEMP_ARR
if ((current.data >= 97 &&
current.data <= 122 ) ||
(current.data >= 65 &&
current.data <= 90 ))
{
TEMP_ARR[i++] = current.data;
current = current.next;
}
// else increase the node position
else
current = current.next;
}
current = head_ref;
// Traverse the linked list again
while (current != null )
{
// if current character is an
// alphabet than replace the
// current element in the linked
// list with the last element
// of the TEMP_ARR
if ((current.data >= 97 &&
current.data <= 122 ) ||
(current.data >= 65 &&
current.data <= 90 ))
{
current.data = TEMP_ARR[--i];
current = current.next;
}
// else increase the node
else
current = current.next;
}
}
// Function to push a node
static Node push(Node head_ref,
char 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;
return head_ref;
}
/* Function to print linked list */
static void printList(Node head)
{
Node temp = head;
while (temp != null )
{
System.out.print(temp.data);
temp = temp.next;
}
}
// Driver Code
public static void main(String rags[])
{
/* Start with the empty list */
Node head = null ;
head = push(head, 's' );
head = push(head, '$' );
head = push(head, 'k' );
head = push(head, 'e' );
head = push(head, 'e' );
head = push(head, '@' );
head = push(head, '#' );
head = push(head, 'g' );
head = push(head, 'r' );
head = push(head, 'o' );
head = push(head, 'f' );
head = push(head, 's' );
head = push(head, '$' );
head = push(head, 'k' );
head = push(head, 'e' );
head = push(head, 'e' );
head = push(head, 'g' );
System.out.print( "Given linked list: " );
printList(head);
reverse(head, 13 );
System.out.print( "Reversed Linked list: " );
printList(head);
}
}
// This code is contributed by Arnab Kundu


Python3

# Python3 program to reverse a linked list
# without affecting special characters
# Link list node
class Node:
def __init__( self , x):
self .data = x
self . next = None
# Function to reverse the linked list
# without affecting special characters
def reverse(head_ref, size):
current = head_ref
TEMP_ARR = [ 0 for i in range ( 256 )]
i = 0
# Traverse the linked list and insert
# linked list elements to TEMP_ARR
while (current ! = None ):
# If the current data is any alphabet than
# store it in to TEMP_ARR
if (( ord (current.data) > = 97 and
ord (current.data) < = 122 ) or
( ord (current.data) > = 65 and
ord (current.data) < = 90 )):
TEMP_ARR[i] = current.data
i + = 1
current = current. next
# Else increase the node position
else :
current = current. next
current = head_ref
# Traverse the linked list again
while (current ! = None ):
# If current character is an alphabet
# than replace the current element in
# the linked list with the last element
# of the TEMP_ARR
if (( ord (current.data) > = 97 and
ord (current.data) < = 122 ) or
( ord (current.data) > = 65 and
ord (current.data) < = 90 )):
i = i - 1
current.data = TEMP_ARR[i]
current = current. next
# Else increase the node
else :
current = current. next
return head_ref
# Function to push a node
def push(head_ref, new_data):
# Allocate node
#new_node = (struct Node*)malloc(sizeof(struct Node));
# Put in the data
new_node = Node(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
return head_ref
# Function to print linked list
def printList(head):
temp = head
while (temp ! = None ):
print (temp.data, end = "")
temp = temp. next
# Driver code
if __name__ = = '__main__' :
# Start with the empty list
head = None
head = push(head, 's' )
head = push(head, '$' )
head = push(head, 'k' )
head = push(head, 'e' )
head = push(head, 'e' )
head = push(head, '@' )
head = push(head, '#' )
head = push(head, 'g' )
head = push(head, 'r' )
head = push(head, 'o' )
head = push(head, 'f' )
head = push(head, 's' )
head = push(head, '$' )
head = push(head, 'k' )
head = push(head, 'e' )
head = push(head, 'e' )
head = push(head, 'g' )
print ( "Given linked list: " , end = "")
printList(head)
head = reverse(head, 13 )
print ( "Reversed Linked list: " , end = "")
printList(head)
# This code is contributed by mohit kumar 29


C#

// C# program to reverse a
// linked list without affecting
// special characters
using System;
class GFG
{
// Link list node
public class Node
{
public char data;
public Node next;
}
// Function to reverse the linked
// list without affecting special
// characters
static void reverse(Node head_ref,
int size)
{
Node current = head_ref;
char []TEMP_ARR = new char [size];
int i = 0;
// Traverse the linked list
// and insert linked list
// elements to TEMP_ARR
while (current != null )
{
// if the current data
// is any alphabet than
// store it in to TEMP_ARR
if ((current.data >= 97 &&
current.data <= 122) ||
(current.data >= 65 &&
current.data <= 90))
{
TEMP_ARR[i++] = current.data;
current = current.next;
}
// else increase the node position
else
current = current.next;
}
current = head_ref;
// Traverse the linked list again
while (current != null )
{
// if current character is an
// alphabet than replace the
// current element in the linked
// list with the last element
// of the TEMP_ARR
if ((current.data >= 97 &&
current.data <= 122) ||
(current.data >= 65 &&
current.data <= 90))
{
current.data = TEMP_ARR[--i];
current = current.next;
}
// else increase the node
else
current = current.next;
}
}
// Function to push a node
static Node push(Node head_ref,
char 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;
return head_ref;
}
/* Function to print linked list */
static void printList(Node head)
{
Node temp = head;
while (temp != null )
{
Console.Write(temp.data);
temp = temp.next;
}
}
// Driver Code
public static void Main(String []rags)
{
/* Start with the empty list */
Node head = null ;
head = push(head, 's' );
head = push(head, '$' );
head = push(head, 'k' );
head = push(head, 'e' );
head = push(head, 'e' );
head = push(head, '@' );
head = push(head, '#' );
head = push(head, 'g' );
head = push(head, 'r' );
head = push(head, 'o' );
head = push(head, 'f' );
head = push(head, 's' );
head = push(head, '$' );
head = push(head, 'k' );
head = push(head, 'e' );
head = push(head, 'e' );
head = push(head, 'g' );
Console.Write( "Given linked list: " );
printList(head);
reverse(head, 13);
Console.Write( "Reversed Linked list: " );
printList(head);
}
}
// This code has been contributed
// by 29AjayKumar


Javascript

<script>
// JavaScript program to reverse a
// linked list without affecting
// special characters
// Link list node
class Node
{
constructor()
{
let data,next;
}
}
// Function to reverse the linked
// list without affecting special
// characters
function reverse(head_ref,size)
{
let current = head_ref;
let TEMP_ARR = new Array(size);
let i = 0;
// Traverse the linked list
// and insert linked list
// elements to TEMP_ARR
while (current != null )
{
// if the current data
// is any alphabet than
// store it in to TEMP_ARR
if ((current.data.charCodeAt(0) >= 97 &&
current.data.charCodeAt(0) <= 122) ||
(current.data.charCodeAt(0) >= 65 &&
current.data.charCodeAt(0) <= 90))
{
TEMP_ARR[i++] = current.data;
current = current.next;
}
// else increase the node position
else
current = current.next;
}
current = head_ref;
// Traverse the linked list again
while (current != null )
{
// if current character is an
// alphabet than replace the
// current element in the linked
// list with the last element
// of the TEMP_ARR
if ((current.data.charCodeAt(0) >= 97 &&
current.data.charCodeAt(0) <= 122) ||
(current.data.charCodeAt(0) >= 65 &&
current.data.charCodeAt(0) <= 90))
{
current.data = TEMP_ARR[--i];
current = current.next;
}
// else increase the node
else
current = current.next;
}
return head_ref;
}
// Function to push a node
function push(head_ref,new_data)
{
/* allocate node */
let 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;
return head_ref;
}
/* Function to print linked list */
function printList(head)
{
let temp = head;
while (temp != null )
{
document.write(temp.data);
temp = temp.next;
}
}
// Driver Code
/* Start with the empty list */
let head = null ;
head = push(head, 's' );
head = push(head, '$' );
head = push(head, 'k' );
head = push(head, 'e' );
head = push(head, 'e' );
head = push(head, '@' );
head = push(head, '#' );
head = push(head, 'g' );
head = push(head, 'r' );
head = push(head, 'o' );
head = push(head, 'f' );
head = push(head, 's' );
head = push(head, '$' );
head = push(head, 'k' );
head = push(head, 'e' );
head = push(head, 'e' );
head = push(head, 'g' );
document.write( "Given linked list: " );
printList(head);
head=reverse(head, 13);
document.write( "<br>Reversed Linked list: " );
printList(head);
// This code is contributed by unknown2108
</script>


输出:

Given linked list: geek$sforg#@eek$sReversed Linked list: skee$grofs#@kee$g

时间复杂性: O(N),其中N是链表中的节点总数。 辅助空间: O(N)

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享