Intercambiar los primeros Nodes pares e impares desde el principio y el final de una lista enlazada

Dada una Lista Vinculada individual , la tarea es intercambiar el primer Node de valor impar desde el principio y el primer Node de valor par desde el final de la Lista Vinculada . Si la lista contiene valores de Node de una sola paridad, no se requieren modificaciones.

Ejemplos:

Entrada: 4 -> 3 -> 5 -> 2 -> 3 -> NULL
Salida: 4 -> 2 -> 5 -> 3 -> 3 -> NULL
Explicación:
4 -> 3 -> 5 -> 2 -> 3 -> NULL ===> 4 -> 2 -> 5 -> 3 -> 3 -> NULL
El primer valor impar en cualquier Node desde el principio es 3 .
El primer valor par en cualquier Node desde el final es 2 .
Después de intercambiar los dos valores de Node anteriores, la lista vinculada se modifica a 4 -> 2 -> 5 -> 3 -> 3 -> NULL.

Entrada: LL: 2 -> 6 -> 8 -> 2 -> NULO
Salida: 2 -> 6 -> 8 -> 2 -> NULO

Enfoque: el problema dado se puede resolver haciendo un seguimiento de la primera y la última aparición de Nodes pares e impares respectivamente e intercambiándolos. Siga los pasos a continuación para resolver el problema:

  • Inicialice dos variables , digamos firstOdd y firstEven , para almacenar el primer Node que tenga valores pares e impares desde el principio y el final respectivamente.
  • Inicialice dos variables, digamos firstOdd y firstEven (inicialmente NULL ).
  • Recorra la lista enlazada y realice los siguientes pasos:
  • Después de completar los pasos anteriores, si firstOdd y firstEven no son NULL , entonces intercambie los valores en ambos punteros .
  • Imprima la Lista vinculada modificada como la Lista vinculada resultante.

A continuación se muestra la implementación del enfoque anterior:

Python3

# Python3 program for the above approach
  
# Structure of a node
# in the Linked List
class Node:
    def __init__(self, x):
        self.val = x
        self.next = None
  
# Function to display the Linked List
def printLL(head):
  
    # Traverse until end
    # of list is reached
    while(head):
      
        # Print the value
        # stored in the head
        print(head.val, end =' ')
          
        # Move to the next of head
        head = head.next
    print()
  
# Function to swap the nodes
def swapNodes(head, even, odd):
  
    # Keeps the track of
    # prevEven and CurrEven
    prevEven = None
    currEven = head
  
    while currEven and currEven != even:
        prevEven = currEven
        currEven = currEven.next
  
    # Keeps the track of
    # prevOdd and currOdd
    prevOdd = None
    currOdd = head
  
    while currOdd and currOdd != odd:
        prevOdd = currOdd
        currOdd = currOdd.next
  
    # If list contains nodes
    # of a single parity
    if not currEven or not currOdd:
        return head
  
    # If head of the linked list
    # does not contain even value
    if prevEven:
        prevEven.next = currOdd
  
    # Make odd node the new head
    else:
        head = currOdd
  
    # If head of the linked list
    # does not contain odd value
    if prevOdd:
        prevOdd.next = currEven
  
    # Make even node the new head
    else:
        head = currEven
  
    # Swap the next pointers
    temp = currEven.next
    currEven.next = currOdd.next
    currOdd.next = temp
  
    # Return the modified Linked List
    return head
  
# Function to swap the first odd node
# from the beginning and the first even
# node from the end of the Linked List
def swapOddAndEvenNodes(head):
  
    # Find the first even node from
    # the end of the Linked List
    even = None
    curr = head
    while curr:
        if not curr.val & 1:
            even = curr
        curr = curr.next
  
    # Find the first odd node from
    # the front of the Linked List
    odd = None
    curr = head
    while curr:
        if curr.val & 1:
            odd = curr
            break
        curr = curr.next
  
    # If required odd and even
    # nodes are found, then swap
    if odd and even:
        head = swapNodes(head, even, odd)
  
    printLL(head)
  
# Function to convert given
# array into a Linked List
def linkedList(arr):
    head = None
    ptr = None
  
    # 4 -> 3 -> 5 -> 2 -> 3 -> NULL
    for i in arr:
        if not head:
            head = Node(i)
            ptr = head
        else:
            newNode = Node(i)
            ptr.next = newNode
            ptr = newNode
    return head
  
# Driver Code
  
# Given Linked List
arr = [4, 3, 5, 2, 3]
  
# Stores head of Linked List
head = linkedList(arr)
  
swapOddAndEvenNodes(head)
Producción:

4 2 5 3 3

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por rohitsingh07052 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *