Excluir meio da lista vinculada

Excluir meio da lista vinculada

Dada uma lista individual vinculada, a tarefa é excluir o nó do meio da lista.

  • Se a lista contiver um número par de nós, haverá dois nós do meio. Nesse caso, exclua o segundo nó do meio.
  • Se a lista vinculada consistir em apenas um nó, retorne nulo.

Exemplo:

Entrada: LinkedList: 1-> 2-> 3-> 4-> 5
Saída: 1-> 2-> 4-> 5
Explicação:

Excluir meio da lista vinculada

Entrada: LinkedList: 2-> 4-> 6-> 7-> 5-> 1
Saída: 2-> 4-> 6-> 5-> 1
Explicação:

Excluir meio da lista vinculada

Entrada: LinkedList: 7
Saída:

Tabela de conteúdo

[Abordagem ingênua] usando travessia de dois passos - o (n) tempo e o (1) espaço

A idéia básica por trás dessa abordagem é primeiro atravessar toda a lista vinculada para contar o número total de nós. Depois que conhecemos o número total de nós, podemos calcular a posição do nó do meio, que está no índice n/2 (onde n é o número total de nós). Em seguida, passe pela lista vinculada novamente, mas desta vez paramos antes do nó do meio. Uma vez lá, modificamos o próximo ponteiro do nó antes do nó do meio, para que ele pula o nó do meio e aponte diretamente para o nó depois dele

Abaixo está a implementação da abordagem acima:

C++
   // C++ program to delete middle of a linked list   #include          using     namespace     std  ;   struct     Node     {      int     data  ;      Node  *     next  ;      Node  (  int     x  ){      data     =     x  ;      next     =     nullptr  ;      }   };   // Function to delete middle node from linked list.   Node  *     deleteMid  (  Node  *     head  )     {      // Edge case: return nullptr if there is only      // one node.      if     (  head  ->  next     ==     nullptr  )      return     nullptr  ;      int     count     =     0  ;      Node     *  p1     =     head       *  p2     =     head  ;      // First pass count the number of nodes      // in the linked list using 'p1'.      while     (  p1     !=     nullptr  )     {      count  ++  ;      p1     =     p1  ->  next  ;      }      // Get the index of the node to be deleted.      int     middleIndex     =     count     /     2  ;      // Second pass let 'p2' move toward the predecessor      // of the middle node.      for     (  int     i     =     0  ;     i      <     middleIndex     -     1  ;     ++  i  )      p2     =     p2  ->  next  ;      // Delete the middle node and return 'head'.      p2  ->  next     =     p2  ->  next  ->  next  ;      return     head  ;   }   void     printList  (  Node  *     head  )     {      Node  *     temp     =     head  ;      while     (  temp     !=     nullptr  )     {      cout      < <     temp  ->  data      < <     ' -> '  ;      temp     =     temp  ->  next  ;      }      cout      < <     'nullptr'      < <     endl  ;   }   int     main  ()     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5.      Node  *     head     =     new     Node  (  1  );      head  ->  next     =     new     Node  (  2  );      head  ->  next  ->  next     =     new     Node  (  3  );      head  ->  next  ->  next  ->  next     =     new     Node  (  4  );      head  ->  next  ->  next  ->  next  ->  next     =     new     Node  (  5  );      cout      < <     'Original Linked List: '  ;      printList  (  head  );      // Delete the middle node.      head     =     deleteMid  (  head  );      cout      < <     'Linked List after deleting the middle node: '  ;      printList  (  head  );      return     0  ;   }   
C
   // C program to delete middle of a linked list   #include         #include         struct     Node     {      int     data  ;      struct     Node  *     next  ;   };   // Function to delete middle node from linked list.   struct     Node  *     deleteMid  (  struct     Node  *     head  )     {      // Edge case: return NULL if there is only      // one node.      if     (  head  ->  next     ==     NULL  )      return     NULL  ;      int     count     =     0  ;      struct     Node     *  p1     =     head       *  p2     =     head  ;      // First pass count the number of nodes      // in the linked list using 'p1'.      while     (  p1     !=     NULL  )     {      count  ++  ;      p1     =     p1  ->  next  ;      }      // Get the index of the node to be deleted.      int     middleIndex     =     count     /     2  ;      // Second pass let 'p2' move toward the predecessor      // of the middle node.      for     (  int     i     =     0  ;     i      <     middleIndex     -     1  ;     ++  i  )      p2     =     p2  ->  next  ;      // Delete the middle node and return 'head'.      p2  ->  next     =     p2  ->  next  ->  next  ;      return     head  ;   }   void     printList  (  struct     Node  *     head  )     {      struct     Node  *     temp     =     head  ;      while     (  temp     !=     NULL  )     {      printf  (  '%d -> '       temp  ->  data  );      temp     =     temp  ->  next  ;      }      printf  (  'NULL  n  '  );   }   struct     Node  *     newNode  (  int     x  )     {      struct     Node  *     temp     =         (  struct     Node  *  )  malloc  (  sizeof  (  struct     Node  ));      temp  ->  data     =     x  ;      temp  ->  next     =     NULL  ;      return     temp  ;   }   int     main  ()     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5.      struct     Node  *     head     =     newNode  (  1  );      head  ->  next     =     newNode  (  2  );      head  ->  next  ->  next     =     newNode  (  3  );      head  ->  next  ->  next  ->  next     =     newNode  (  4  );      head  ->  next  ->  next  ->  next  ->  next     =     newNode  (  5  );      printf  (  'Original Linked List: '  );      printList  (  head  );      // Delete the middle node.      head     =     deleteMid  (  head  );      printf  (  'Linked List after deleting the middle node: '  );      printList  (  head  );      return     0  ;   }   
Java
   // Java program to delete middle of a linked list   class   Node     {      int     data  ;      Node     next  ;      Node  (  int     x  )     {      data     =     x  ;      next     =     null  ;      }   }   public     class   GfG     {      // Function to delete middle node from linked list.      public     static     Node     deleteMid  (  Node     head  )     {      // Edge case: return null if there is only      // one node.      if     (  head  .  next     ==     null  )      return     null  ;      int     count     =     0  ;      Node     p1     =     head       p2     =     head  ;      // First pass count the number of nodes      // in the linked list using 'p1'.      while     (  p1     !=     null  )     {      count  ++  ;      p1     =     p1  .  next  ;      }      // Get the index of the node to be deleted.      int     middleIndex     =     count     /     2  ;      // Second pass let 'p2' move toward predecessor      // of the middle node.      for     (  int     i     =     0  ;     i      <     middleIndex     -     1  ;     ++  i  )      p2     =     p2  .  next  ;      // Delete the middle node and return 'head'.      p2  .  next     =     p2  .  next  .  next  ;      return     head  ;      }      public     static     void     printList  (  Node     head  )     {      Node     temp     =     head  ;      while     (  temp     !=     null  )     {      System  .  out  .  print  (  temp  .  data     +     ' -> '  );      temp     =     temp  .  next  ;      }      System  .  out  .  println  (  'null'  );      }      public     static     void     main  (  String  []     args  )     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5.      Node     head     =     new     Node  (  1  );      head  .  next     =     new     Node  (  2  );      head  .  next  .  next     =     new     Node  (  3  );      head  .  next  .  next  .  next     =     new     Node  (  4  );      head  .  next  .  next  .  next  .  next     =     new     Node  (  5  );      System  .  out  .  print  (  'Original Linked List: '  );      printList  (  head  );      // Delete the middle node.      head     =     deleteMid  (  head  );      System  .  out  .  print      (  'Linked List after deleting the middle node: '  );      printList  (  head  );      }   }   
Python
   # Python3 program to delete middle of a linked list   class   Node  :   def   __init__  (  self     data  ):   self  .  data   =   data   self  .  next   =   None   # Function to delete middle node from linked list.   def   deleteMid  (  head  ):   # Edge case: return None if there is only   # one node.   if   head  .  next   is   None  :   return   None   count   =   0   p1   =   head   p2   =   head   # First pass count the number of nodes   # in the linked list using 'p1'.   while   p1   is   not   None  :   count   +=   1   p1   =   p1  .  next   # Get the index of the node to be deleted.   middleIndex   =   count   //   2   # Second pass let 'p2' move toward the predecessor   # of the middle node.   for   i   in   range  (  middleIndex   -   1  ):   p2   =   p2  .  next   # Delete the middle node and return 'head'.   p2  .  next   =   p2  .  next  .  next   return   head   def   printList  (  head  ):   temp   =   head   while   temp   is   not   None  :   print  (  temp  .  data     end  =  ' -> '  )   temp   =   temp  .  next   print  (  'None'  )   if   __name__   ==   '__main__'  :   # Create a static hardcoded linked list:   # 1 -> 2 -> 3 -> 4 -> 5.   head   =   Node  (  1  )   head  .  next   =   Node  (  2  )   head  .  next  .  next   =   Node  (  3  )   head  .  next  .  next  .  next   =   Node  (  4  )   head  .  next  .  next  .  next  .  next   =   Node  (  5  )   print  (  'Original Linked List:'     end  =  ' '  )   printList  (  head  )   # Delete the middle node.   head   =   deleteMid  (  head  )   print  (  'Linked List after deleting the middle node:'     end  =  ' '  )   printList  (  head  )   
C#
   // C# program to delete middle of a linked list   using     System  ;   class     Node     {      public     int     data  ;      public     Node     next  ;      public     Node  (  int     x  )     {      data     =     x  ;      next     =     null  ;      }   }   class     GfG     {      // Function to delete middle node from linked list.      static     Node     deleteMid  (  Node     head  )     {      // Edge case: return null if there is only      // one node.      if     (  head  .  next     ==     null  )      return     null  ;      int     count     =     0  ;      Node     p1     =     head       p2     =     head  ;      // First pass count the number of nodes      // in the linked list using 'p1'.      while     (  p1     !=     null  )     {      count  ++  ;      p1     =     p1  .  next  ;      }      // Get the index of the node to be deleted.      int     middleIndex     =     count     /     2  ;      // Second pass let 'p2' move toward the predecessor      // of the middle node.      for     (  int     i     =     0  ;     i      <     middleIndex     -     1  ;     ++  i  )      p2     =     p2  .  next  ;      // Delete the middle node and return 'head'.      p2  .  next     =     p2  .  next  .  next  ;      return     head  ;      }      static     void     printList  (  Node     head  )     {      Node     temp     =     head  ;      while     (  temp     !=     null  )     {      Console  .  Write  (  temp  .  data     +     ' -> '  );      temp     =     temp  .  next  ;      }      Console  .  WriteLine  (  'null'  );      }      static     void     Main  (  string  []     args  )     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5.      Node     head     =     new     Node  (  1  );      head  .  next     =     new     Node  (  2  );      head  .  next  .  next     =     new     Node  (  3  );      head  .  next  .  next  .  next     =     new     Node  (  4  );      head  .  next  .  next  .  next  .  next     =     new     Node  (  5  );      Console  .  Write  (  'Original Linked List: '  );      printList  (  head  );      // Delete the middle node.      head     =     deleteMid  (  head  );      Console  .  Write      (  'Linked List after deleting the middle node: '  );      printList  (  head  );      }   }   
JavaScript
   class     Node     {      constructor  (  data  )     {      this  .  data     =     data  ;      this  .  next     =     null  ;      }   }   // Function to delete middle node from linked list.   function     deleteMid  (  head  )     {      // Edge case: return null if there is only      // one node.      if     (  head  .  next     ===     null  )      return     null  ;      let     count     =     0  ;      let     p1     =     head       p2     =     head  ;      // First pass count the number of nodes      // in the linked list using 'p1'.      while     (  p1     !==     null  )     {      count  ++  ;      p1     =     p1  .  next  ;      }      // Get the index of the node to be deleted.      let     middleIndex     =     Math  .  floor  (  count     /     2  );      // Second pass let 'p2' move toward the predecessor      // of the middle node.      for     (  let     i     =     0  ;     i      <     middleIndex     -     1  ;     ++  i  )      p2     =     p2  .  next  ;      // Delete the middle node and return 'head'.      p2  .  next     =     p2  .  next  .  next  ;      return     head  ;   }   function     printList  (  head  )     {      let     temp     =     head  ;      while     (  temp     !==     null  )     {      console  .  log  (  temp  .  data     +     ' -> '  );      temp     =     temp  .  next  ;      }      console  .  log  (  'null'  );   }   // Create a static hardcoded linked list:   // 1 -> 2 -> 3 -> 4 -> 5.   let     head     =     new     Node  (  1  );   head  .  next     =     new     Node  (  2  );   head  .  next  .  next     =     new     Node  (  3  );   head  .  next  .  next  .  next     =     new     Node  (  4  );   head  .  next  .  next  .  next  .  next     =     new     Node  (  5  );   console  .  log  (  'Original Linked List: '  );   printList  (  head  );   // Delete the middle node.   head     =     deleteMid  (  head  );   console  .  log  (  'Linked List after deleting the middle node: '  );   printList  (  head  );   

Saída
Original Linked List: 1 -> 2 -> 3 -> 4 -> 5 -> nullptr Linked List after deleting the middle node: 1 -> 2 -> 4 -> 5 -> nullptr  

Complexidade do tempo: Sobre). São necessários dois travessia da lista vinculada
Espaço auxiliar: O (1). Nenhum espaço extra é necessário.

[Abordagem esperada] Travessal de uma passagem com ponteiros lentos e rápidos - o (n) tempo e o (1) espaço

A solução acima requer dois travessos da lista vinculada. O nó do meio pode ser excluído usando uma travessia. A idéia é usar dois ponteiros Slow_Ptr e fast_ptr . O ponteiro rápido move dois nós de cada vez, enquanto o ponteiro lento se move um nó de cada vez. Quando o ponteiro rápido chegar ao final da lista, o ponteiro lento será posicionado no nó do meio. Em seguida, você precisa conectar o nó que vem antes do nó do meio ( Anterior ) para o nó que vem após o nó do meio. Isso pula efetivamente sobre o nó do meio, removendo -o da lista.

Abaixo está a implementação da abordagem acima

C++
   // C++ program to delete middle of a linked list   #include          using     namespace     std  ;   struct     Node     {      int     data  ;      Node  *     next  ;      Node  (  int     x  ){      data     =     x  ;      next     =     nullptr  ;      }   };   // Function to delete middle node from linked list   struct     Node  *     deleteMid  (  struct     Node  *     head  )     {      // If the list is empty return NULL      if     (  head     ==     NULL  )      return     NULL  ;      // If the list has only one node      // delete it and return NULL      if     (  head  ->  next     ==     NULL  )     {      delete     head  ;      return     NULL  ;      }      struct     Node  *     prev     =     NULL  ;      struct     Node  *     slow_ptr     =     head  ;      struct     Node  *     fast_ptr     =     head  ;      // Move the fast pointer 2 nodes ahead      // and the slow pointer 1 node ahead      // until fast pointer reaches end of the list      while     (  fast_ptr     !=     NULL     &&     fast_ptr  ->  next     !=     NULL  )     {      fast_ptr     =     fast_ptr  ->  next  ->  next  ;         // Update prev to hold the previous       // slow pointer value      prev     =     slow_ptr  ;         slow_ptr     =     slow_ptr  ->  next  ;         }      // At this point slow_ptr points to middle node      // Bypass the middle node      prev  ->  next     =     slow_ptr  ->  next  ;      // Delete the middle node      delete     slow_ptr  ;         // Return the head of the modified list      return     head  ;   }   void     printList  (  struct     Node  *     head  )     {      struct     Node  *     temp     =     head  ;      while     (  temp     !=     NULL  )     {      cout      < <     temp  ->  data      < <     ' -> '  ;      temp     =     temp  ->  next  ;      }      cout      < <     'NULL'      < <     endl  ;   }   int     main  ()     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5      Node  *     head     =     new     Node  (  1  );      head  ->  next     =     new     Node  (  2  );      head  ->  next  ->  next     =     new     Node  (  3  );      head  ->  next  ->  next  ->  next     =     new     Node  (  4  );      head  ->  next  ->  next  ->  next  ->  next     =     new     Node  (  5  );      cout      < <     'Original Linked List: '  ;      printList  (  head  );      // Delete the middle node      head     =     deleteMid  (  head  );      cout      < <     'Linked List after deleting the middle node: '  ;      printList  (  head  );      return     0  ;   }   
C
   // C program to delete middle of a linked list   #include         #include         struct     Node     {      int     data  ;      struct     Node  *     next  ;   };   // Function to delete middle node from linked list   struct     Node  *     deleteMid  (  struct     Node  *     head  )     {      // If the list is empty return NULL      if     (  head     ==     NULL  )      return     NULL  ;      // If the list has only one node      // delete it and return NULL      if     (  head  ->  next     ==     NULL  )     {      free  (  head  );      return     NULL  ;      }      struct     Node  *     prev     =     NULL  ;      struct     Node  *     slow_ptr     =     head  ;      struct     Node  *     fast_ptr     =     head  ;      // Move the fast pointer 2 nodes ahead      // and the slow pointer 1 node ahead      // until fast pointer reaches end of the list      while     (  fast_ptr     !=     NULL     &&     fast_ptr  ->  next     !=     NULL  )     {      fast_ptr     =     fast_ptr  ->  next  ->  next  ;      // Update prev to hold the previous       // slow pointer value      prev     =     slow_ptr  ;      slow_ptr     =     slow_ptr  ->  next  ;      }      // At this point slow_ptr points to middle node      // Bypass the middle node      prev  ->  next     =     slow_ptr  ->  next  ;      // Delete the middle node      free  (  slow_ptr  );      // Return the head of the modified list      return     head  ;   }   void     printList  (  struct     Node  *     head  )     {      struct     Node  *     temp     =     head  ;      while     (  temp     !=     NULL  )     {      printf  (  '%d -> '       temp  ->  data  );      temp     =     temp  ->  next  ;      }      printf  (  'NULL  n  '  );   }   struct     Node  *     newNode  (  int     x  )     {      struct     Node  *     temp     =         (  struct     Node  *  )  malloc  (  sizeof  (  struct     Node  ));      temp  ->  data     =     x  ;      temp  ->  next     =     NULL  ;      return     temp  ;   }   int     main  ()     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5.      struct     Node  *     head     =     newNode  (  1  );      head  ->  next     =     newNode  (  2  );      head  ->  next  ->  next     =     newNode  (  3  );      head  ->  next  ->  next  ->  next     =     newNode  (  4  );      head  ->  next  ->  next  ->  next  ->  next     =     newNode  (  5  );      printf  (  'Original Linked List: '  );      printList  (  head  );      // Delete the middle node.      head     =     deleteMid  (  head  );      printf  (  'Linked List after deleting the middle node: '  );      printList  (  head  );      return     0  ;   }   
Java
   // Java program to delete the middle of a linked list   class   Node     {      int     data  ;      Node     next  ;      Node  (  int     x  )     {      data     =     x  ;      next     =     null  ;      }   }   class   GfG     {      // Function to delete middle node from linked list      static     Node     deleteMid  (  Node     head  )     {      // If the list is empty return null      if     (  head     ==     null  )      return     null  ;      // If the list has only one node      // delete it and return null      if     (  head  .  next     ==     null  )     {      return     null  ;      }      Node     prev     =     null  ;      Node     slow_ptr     =     head  ;      Node     fast_ptr     =     head  ;      // Move the fast pointer 2 nodes ahead      // and the slow pointer 1 node ahead      // until fast pointer reaches end of list      while     (  fast_ptr     !=     null         &&     fast_ptr  .  next     !=     null  )     {      fast_ptr     =     fast_ptr  .  next  .  next  ;      // Update prev to hold the previous       // slow pointer value      prev     =     slow_ptr  ;      slow_ptr     =     slow_ptr  .  next  ;      }      // At this pointslow_ptr points to middle node      // Bypass the middle node      prev  .  next     =     slow_ptr  .  next  ;      // Return the head of the modified list      return     head  ;      }          static     void     printList  (  Node     head  )     {      Node     temp     =     head  ;      while     (  temp     !=     null  )     {      System  .  out  .  print  (  temp  .  data     +     ' -> '  );      temp     =     temp  .  next  ;      }      System  .  out  .  println  (  'NULL'  );      }          public     static     void     main  (  String  []     args  )     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5      Node     head     =     new     Node  (  1  );      head  .  next     =     new     Node  (  2  );      head  .  next  .  next     =     new     Node  (  3  );      head  .  next  .  next  .  next     =     new     Node  (  4  );      head  .  next  .  next  .  next  .  next     =     new     Node  (  5  );      System  .  out  .  print  (  'Original Linked List: '  );      printList  (  head  );      // Delete the middle node      head     =     deleteMid  (  head  );      System  .  out  .  print      (  'Linked List after deleting the middle node: '  );      printList  (  head  );      }   }   
Python
   # Python program to delete the middle of a linked list   class   Node  :   def   __init__  (  self     data  ):   self  .  data   =   data   self  .  next   =   None   # Function to delete middle node from linked list   def   deleteMid  (  head  ):   # If the list is empty return None   if   head   is   None  :   return   None   # If the list has only one node   # delete it and return None   if   head  .  next   is   None  :   return   None   prev   =   None   slow_ptr   =   head   fast_ptr   =   head   # Move the fast pointer 2 nodes ahead   # and the slow pointer 1 node ahead   # until fast pointer reaches end of the list   while   fast_ptr   is   not   None   and   fast_ptr  .  next   is   not   None  :   fast_ptr   =   fast_ptr  .  next  .  next   # Update prev to hold the previous   # slow pointer value   prev   =   slow_ptr   slow_ptr   =   slow_ptr  .  next   # At this point slow_ptr points to middle node   # Bypass the middle node   prev  .  next   =   slow_ptr  .  next   # Return the head of the modified list   return   head   def   printList  (  head  ):   temp   =   head   while   temp  :   print  (  temp  .  data     end  =  ' -> '  )   temp   =   temp  .  next   print  (  'NULL'  )   if   __name__   ==   '__main__'  :   # Create a static hardcoded linked list:   # 1 -> 2 -> 3 -> 4 -> 5   head   =   Node  (  1  )   head  .  next   =   Node  (  2  )   head  .  next  .  next   =   Node  (  3  )   head  .  next  .  next  .  next   =   Node  (  4  )   head  .  next  .  next  .  next  .  next   =   Node  (  5  )   print  (  'Original Linked List: '     end  =  ''  )   printList  (  head  )   # Delete the middle node   head   =   deleteMid  (  head  )   print  (  'Linked List after deleting the middle node: '     end  =  ''  )   printList  (  head  )   
C#
   // C# program to delete middle of a linked list   using     System  ;   class     Node     {      public     int     data  ;      public     Node     next  ;          public     Node  (  int     x  )     {      data     =     x  ;      next     =     null  ;      }   }   class     GfG     {      // Function to delete middle node from linked list      public     static     Node     deleteMid  (  Node     head  )     {      // If the list is empty return null      if     (  head     ==     null  )      return     null  ;      // If the list has only one node      // delete it and return null      if     (  head  .  next     ==     null  )     {      return     null  ;      }      Node     prev     =     null  ;      Node     slow_ptr     =     head  ;      Node     fast_ptr     =     head  ;      // Move the fast pointer 2 nodes ahead      // and the slow pointer 1 node ahead      // until fast pointer reaches end of the list      while     (  fast_ptr     !=     null     &&     fast_ptr  .  next     !=     null  )     {      fast_ptr     =     fast_ptr  .  next  .  next  ;      // Update prev to hold the previous       // slow pointer value      prev     =     slow_ptr  ;      slow_ptr     =     slow_ptr  .  next  ;      }      // At this point slow_ptr points to middle node      // Bypass the middle node      prev  .  next     =     slow_ptr  .  next  ;      // Return the head of the modified list      return     head  ;      }      // Function to print the linked list      public     static     void     printList  (  Node     head  )     {      Node     temp     =     head  ;      while     (  temp     !=     null  )     {      Console  .  Write  (  temp  .  data     +     ' -> '  );      temp     =     temp  .  next  ;      }      Console  .  WriteLine  (  'NULL'  );      }      public     static     void     Main  (  string  []     args  )     {      // Create a static hardcoded linked list:      // 1 -> 2 -> 3 -> 4 -> 5      Node     head     =     new     Node  (  1  );      head  .  next     =     new     Node  (  2  );      head  .  next  .  next     =     new     Node  (  3  );      head  .  next  .  next  .  next     =     new     Node  (  4  );      head  .  next  .  next  .  next  .  next     =     new     Node  (  5  );      Console  .  Write  (  'Original Linked List: '  );      printList  (  head  );      // Delete the middle node      head     =     deleteMid  (  head  );      Console  .  Write      (  'Linked List after deleting the middle node: '  );      printList  (  head  );      }   }   
JavaScript
   // javascript program to delete middle of a linked list   class     Node     {      constructor  (  data  )      {      this  .  data     =     data  ;      this  .  next     =     null  ;      }   }   // Function to delete the middle node from the linked list   function     deleteMid  (  head  )   {      // If the list is empty return null      if     (  head     ===     null  )     {      return     null  ;      }      // If the list has only one node delete it and return      // null      if     (  head  .  next     ===     null  )     {      return     null  ;      }      let     prev     =     null  ;      let     slow_ptr     =     head  ;      let     fast_ptr     =     head  ;      // Move the fast pointer 2 nodes ahead      // and the slow pointer 1 node ahead      // until the fast pointer reaches the end of the list      while     (  fast_ptr     !==     null     &&     fast_ptr  .  next     !==     null  )     {      fast_ptr     =     fast_ptr  .  next  .  next  ;      // Update prev to hold the previous slow pointer      // value      prev     =     slow_ptr  ;      slow_ptr     =     slow_ptr  .  next  ;      }      // At this point slow_ptr points to the middle node      // Bypass the middle node      prev  .  next     =     slow_ptr  .  next  ;      // Return the head of the modified list      return     head  ;   }   function     printList  (  head  )   {      let     temp     =     head  ;      while     (  temp     !==     null  )     {      process  .  stdout  .  write  (  temp  .  data     +     ' -> '  );      temp     =     temp  .  next  ;      }      console  .  log  (  'null'  );   }   // Create a static hardcoded linked list:   // 1 -> 2 -> 3 -> 4 -> 5   let     head     =     new     Node  (  1  );   head  .  next     =     new     Node  (  2  );   head  .  next  .  next     =     new     Node  (  3  );   head  .  next  .  next  .  next     =     new     Node  (  4  );   head  .  next  .  next  .  next  .  next     =     new     Node  (  5  );   process  .  stdout  .  write  (  'Original Linked List: '  );   printList  (  head  );   // Delete the middle node   head     =     deleteMid  (  head  );   process  .  stdout  .  write  (      'Linked List after deleting the middle node: '  );   printList  (  head  );   

Saída
Original Linked List: 1 -> 2 -> 3 -> 4 -> 5 -> NULL Linked List after deleting the middle node: 1 -> 2 -> 4 -> 5 -> NULL  

Complexidade do tempo: Sobre). Apenas uma travessia da lista vinculada é necessária
Espaço auxiliar: O (1). Como não é necessário espaço extra.

Artigo relacionado:

  • Encontre o meio da lista vinculada