📜  反向链接列表中的偶数元素

📅  最后修改于: 2021-04-22 01:44:15             🧑  作者: Mango

给定一个链表,任务是反转连续的偶数元素并打印更新的链表。

方法:在以下情况下,将不会反转连续的偶数元素:

  1. 节点的值是奇数。
  2. 节点的值是偶数,但相邻的值是奇数。

在其他情况下,偶数节点的连续块可以颠倒。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Structure of a node of the linked list
struct node {
    int data;
    struct node* next;
};
  
// Function to create a new node
struct node* newNode(int d)
{
    struct node* newnode = new node();
    newnode->data = d;
    newnode->next = NULL;
    return newnode;
}
  
// Recursive function to reverse the consecutive
// even nodes of the linked list
struct node* reverse(struct node* head, struct node* prev)
{
  
    // Base case
    if (head == NULL)
        return NULL;
  
    struct node* temp;
    struct node* curr;
    curr = head;
  
    // Reversing nodes until curr node's value
    // turn odd or Linked list is fully traversed
    while (curr != NULL && curr->data % 2 == 0) {
        temp = curr->next;
        curr->next = prev;
        prev = curr;
        curr = temp;
    }
  
    // If elements were reversed then head
    // pointer needs to be changed
    if (curr != head) {
  
        head->next = curr;
  
        // Recur for the remaining linked list
        curr = reverse(curr, NULL);
        return prev;
    }
  
    // Simply iterate over the odd value nodes
    else {
        head->next = reverse(head->next, head);
        return head;
    }
}
  
// Utility function to print the
// contents of the linked list
void printLinkedList(struct node* head)
{
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }
}
  
// Driver code
int main()
{
    int arr[] = { 1, 2, 3, 3, 4, 6, 8, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    struct node* head = NULL;
    struct node* p;
  
    // Constructing linked list
    for (int i = 0; i < n; i++) {
  
        if (head == NULL) {
            p = newNode(arr[i]);
            head = p;
            continue;
        }
        p->next = newNode(arr[i]);
        p = p->next;
    }
  
    // Head of the updated linked list
    head = reverse(head, NULL);
  
    // Printing the reversed linked list
    printLinkedList(head);
  
    return 0;
}


Java
// Java implementation of the approach 
import java.util.*;
  
class GFG
{
  
// Structure of a node of the linked list
static class node
{
    int data;
    node next;
};
  
// Function to create a new node
static node newNode(int d)
{
    node newnode = new node();
    newnode.data = d;
    newnode.next = null;
    return newnode;
}
  
// Recursive function to reverse the consecutive
// even nodes of the linked list
static node reverse(node head, node prev)
{
  
    // Base case
    if (head == null)
        return null;
  
    node temp;
    node curr;
    curr = head;
  
    // Reversing nodes until curr node's value
    // turn odd or Linked list is fully traversed
    while (curr != null && curr.data % 2 == 0) 
    {
        temp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = temp;
    }
  
    // If elements were reversed then head
    // pointer needs to be changed
    if (curr != head) 
    {
        head.next = curr;
  
        // Recur for the remaining linked list
        curr = reverse(curr, null);
        return prev;
    }
  
    // Simply iterate over the odd value nodes
    else
    {
        head.next = reverse(head.next, head);
        return head;
    }
}
  
// Utility function to print the
// contents of the linked list
static void printLinkedList(node head)
{
    while (head != null)
    {
        System.out.print(head.data + " ");
        head = head.next;
    }
}
  
// Driver code
public static void main(String[] args)
{
    int arr[] = { 1, 2, 3, 3, 4, 6, 8, 5 };
    int n = arr.length;
  
    node head = null;
    node p = new node();
  
    // Constructing linked list
    for (int i = 0; i < n; i++)
    {
        if (head == null) 
        {
            p = newNode(arr[i]);
            head = p;
            continue;
        }
        p.next = newNode(arr[i]);
        p = p.next;
    }
  
    // Head of the updated linked list
    head = reverse(head, null);
  
    // Printing the reversed linked list
    printLinkedList(head);
}
} 
  
// This code is contributed by PrinciRaj1992


Python
# Python implementation of the approach 
  
# Node of a linked list 
class Node: 
    def __init__(self, next = None, data = None): 
        self.next = next
        self.data = data 
  
# Function to create a new node
def newNode( d):
  
    newnode = Node()
    newnode.data = d
    newnode.next = None
    return newnode
  
# Recursive function to reverse the consecutive
# even nodes of the linked list
def reverse(head, prev):
  
    # Base case
    if (head == None):
        return None
  
    temp = None
    curr = None
    curr = head
  
    # Reversing nodes until curr node's value
    # turn odd or Linked list is fully traversed
    while (curr != None and curr.data % 2 == 0) :
        temp = curr.next
        curr.next = prev
        prev = curr
        curr = temp
  
    # If elements were reversed then head
    # pointer needs to be changed
    if (curr != head) :
      
        head.next = curr
  
        # Recur for the remaining linked list
        curr = reverse(curr, None)
        return prev
      
    # Simply iterate over the odd value nodes
    else:
      
        head.next = reverse(head.next, head)
        return head
      
# Utility function to print the
# contents of the linked list
def printLinkedList(head):
  
    while (head != None):
      
        print(head.data ,end= " ")
        head = head.next
      
# Driver code
arr = [ 1, 2, 3, 3, 4, 6, 8, 5 ]
n = len(arr)
  
head = None
p = Node()
  
i = 0
  
# Constructing linked list
while ( i < n ):
      
    if (head == None):
          
        p = newNode(arr[i])
        head = p
    else:
        p.next = newNode(arr[i])
        p = p.next
    i = i + 1;
  
# Head of the updated linked list
head = reverse(head, None)
  
# Printing the reversed linked list
printLinkedList(head)
  
# This code is contributed by Arnab Kundu


C#
// C# implementation of the above approach
using System;
  
class GFG
{
  
// Structure of a node of the linked list
public class node
{
    public int data;
    public node next;
};
  
// Function to create a new node
static node newNode(int d)
{
    node newnode = new node();
    newnode.data = d;
    newnode.next = null;
    return newnode;
}
  
// Recursive function to reverse the consecutive
// even nodes of the linked list
static node reverse(node head, node prev)
{
  
    // Base case
    if (head == null)
        return null;
  
    node temp;
    node curr;
    curr = head;
  
    // Reversing nodes until curr node's value
    // turn odd or Linked list is fully traversed
    while (curr != null && curr.data % 2 == 0) 
    {
        temp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = temp;
    }
  
    // If elements were reversed then head
    // pointer needs to be changed
    if (curr != head) 
    {
        head.next = curr;
  
        // Recur for the remaining linked list
        curr = reverse(curr, null);
        return prev;
    }
  
    // Simply iterate over the odd value nodes
    else
    {
        head.next = reverse(head.next, head);
        return head;
    }
}
  
// Utility function to print the
// contents of the linked list
static void printLinkedList(node head)
{
    while (head != null)
    {
        Console.Write(head.data + " ");
        head = head.next;
    }
}
  
// Driver code
public static void Main(String[] args)
{
    int []arr = { 1, 2, 3, 3, 4, 6, 8, 5 };
    int n = arr.Length;
  
    node head = null;
    node p = new node();
  
    // Constructing linked list
    for (int i = 0; i < n; i++)
    {
        if (head == null) 
        {
            p = newNode(arr[i]);
            head = p;
            continue;
        }
        p.next = newNode(arr[i]);
        p = p.next;
    }
  
    // Head of the updated linked list
    head = reverse(head, null);
  
    // Printing the reversed linked list
    printLinkedList(head);
}
}
  
// This code is contributed by PrinciRaj1992


输出:
1 2 3 3 8 6 4 5

时间复杂度: O(N)
空间复杂度: O(1)