Enfoque iterativo para eliminar puntos medios en una lista enlazada de segmentos de línea

Esta publicación explica el enfoque iterativo de este problema. 
Mantenemos dos punteros, anterior y temporal. Si estos dos tienen x o y iguales, avanzamos hasta que se mantiene la igualdad y seguimos eliminando los Nodes intermedios. El Node desde el que comenzó la igualdad, ajustamos el siguiente puntero de ese Node.
 

C++

// C++ program to remove intermediate 
// points in a linked list that represents
// horizontal and vertical line segments
#include <iostream>
using namespace std;
  
// Node has 3 fields including x, y
// coordinates and a pointer to next node
struct Node {
    int x, y;
    struct Node *next;
};
  
/* Function to insert a node at the beginning */
void push(struct Node **head_ref, int x, int y)
{
    struct Node *new_node = new Node;   
    new_node->x = x;
    new_node->y = y;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
  
/* Utility function to print a singly linked list */
void printList(struct Node *head)
{
    struct Node *temp = head;    
    while (temp != NULL) {
        printf("(%d, %d)-> ", temp->x, temp->y);        
        temp = temp->next;
    }    
    printf("\n");
}
  
// This function deletes middle nodes in a 
// sequence of horizontal and vertical line 
// segments represented by linked list.
void delete_Middle_Nodes(Node *head) 
{    
    Node *temp = head->next, *prev = head;  
    
    while (temp) {
          
        // checking equality of point x
        if (temp->x == prev->x) 
        {
            Node *curr = prev;
            prev = temp;
            temp = temp->next;        
              
            // removing vertical points of line 
            // segment from linked list
            while (temp && temp->x == prev->x) 
            {
                curr->next = temp;
                free(prev);
                prev = temp;
                temp = temp->next;
            }
        }
  
        // checking equality of point y
        else if (temp->y == prev->y) 
        {
            Node *curr = prev;
            prev = temp;
            temp = temp->next;
              
            // removing horizontal points of line 
            // segment from linked list
            while (temp && temp->y == prev->y)
            {
                curr->next = temp;
                free(prev);
                prev = temp;
                temp = temp->next;
            }
        } else {
            prev = temp;
            temp = temp->next;
        }
    }
}
  
// Driver program to test above functions
int main() {
    struct Node *head = NULL;
      
    push(&head, 40,5);
    push(&head, 20,5);
    push(&head, 10,5);
    push(&head, 10,8);
    push(&head, 10,10);
    push(&head, 3,10);
    push(&head, 1,10);
    push(&head, 0,10);
      
    printf("Given Linked List: \n");
    printList(head);
      
    delete_Middle_Nodes(head);
      
    printf("Modified Linked List: \n");
    printList(head);
      
    return 0;
}

Java

class LinkedList
{
    Node head; // head of list
  
    /* Linked list Node*/
    class Node
    {
        int x,y;
        Node next;
        Node(int x, int y)
        {
            this.x = x;
            this.y = y;
            next = null;
        }
    }
  
    // This function deletes middle nodes in a sequence of
    // horizontal and vertical line segments represented
    // by linked list.
    private void delete_Middle_Nodes(Node head)
    {
        Node prev = head;
        Node temp = head.next;
  
        while (temp != null)
        {
  
            // checking equality of point x
            if (temp.x == prev.x)
            {
                Node curr = prev;
                prev = temp;
                temp = temp.next;
  
                // removing vertical points of line 
                // segment from linked list
                while (temp != null && temp.x == prev.x)
                {
                    curr.next = temp;
                    prev.next = null;
                    prev = temp;
                    temp = temp.next;
                }
            }
  
            // checking equality of point y 
            else if (temp.y == prev.y)
            {
                Node curr = prev;
                prev = temp;
                temp = temp.next;
  
                // removing horizontal points of line 
                // segment from linked list
                while (temp != null && temp.y == prev.y)
                {
                    curr.next = temp;
                    prev.next = null;
                    prev = temp;
                    temp = temp.next;
                }
            } 
            else
            {
                prev =temp;
                temp = temp.next;
            }
        }
    }
  
    /* Given a reference (pointer to pointer) to the head
        of a list and an int, push a new node on the front
        of the list. */
    void push(int x, int y)
    {
        /* 1 & 2: Allocate the Node &
                Put in the data*/
        Node new_node = new Node(x,y);
  
        /* 3. Make next of new Node as head */
        new_node.next = head;
  
        /* 4. Move the head to point to new Node */
        head = new_node;
    }
  
  
    void printList()
    {
        Node temp = head;
        while (temp != null)
        {
            System.out.print("(" + temp.x + "," + temp.y + ")->");
            temp = temp.next;
        }
        System.out.println();
    }
  
  
    /* Driver code */
    public static void main(String args[])
    {
        LinkedList llist = new LinkedList();
  
        llist.push(40,5);
        llist.push(20,5);
        llist.push(10,5);
        llist.push(10,8);
        llist.push(10,10);
        llist.push(3,10);
        llist.push(1,10);
        llist.push(0,10);
  
        System.out.println("Given list");
        llist.printList();
  
        llist.delete_Middle_Nodes(llist.head);
  
        System.out.println("Modified Linked List is");
        llist.printList();
    }
}
  
// This code is contributed by shubham96301.

Python3

# Python3 program to remove intermediate 
# points in a linked list that represents
# horizontal and vertical line segments
import math
  
# Node has 3 fields including x, y
# coordinates and a pointer to next node
class Node: 
    def __init__(self, x, y): 
        self.x = x
        self.y = y
        self.next = None
  
# Function to insert a node at the beginning 
def push(head_ref, x, y):
    new_node = Node(x, y) 
    new_node.x = x
    new_node.y = y
    new_node.next = head_ref
    head_ref = new_node
    return head_ref
  
# Utility function to print 
# a singly linked list 
def printList(head):
    temp = head 
    while (temp != None):
        print("(", temp.x, ",",
                   temp.y, ")", end = "->",)     
        temp = temp.next
          
    print()
  
# This function deletes middle nodes in a 
# sequence of horizontal and vertical line 
# segments represented by linked list.
def delete_Middle_Nodes(head): 
    temp = head.next
    prev = head 
      
    while (temp):
          
        # checking equality of point x
        if (temp.x == prev.x):
            curr = prev
            prev = temp
            temp = temp.next    
              
            # removing vertical points of line 
            # segment from linked list
            while (temp != None and temp.x == prev.x):
                curr.next = temp
                  
                #free(prev)
                prev = temp
                temp = temp.next
              
        # checking equality of point y
        elif (temp.y == prev.y):
            curr = prev
            prev = temp
            temp = temp.next
              
            # removing horizontal points of line 
            # segment from linked list
            while (temp != None and temp.y == prev.y):
                curr.next = temp
                #free(prev)
                prev = temp
                temp = temp.next
              
        else:
            prev = temp
            temp = temp.next
          
# Driver Code
if __name__=='__main__': 
    head = None
      
    head = push(head, 40, 5)
    head = push(head, 20, 5)
    head = push(head, 10, 5)
    head = push(head, 10, 8)
    head = push(head, 10, 10)
    head = push(head, 3, 10)
    head = push(head, 1, 10)
    head = push(head, 0, 10)
      
    print("Given Linked List: \n", end = "")
    printList(head)
      
    delete_Middle_Nodes(head)
      
    print("Modified Linked List: \n", end = "")
    printList(head)
      
# This code is contributed by AbhiThakur

C#

// C# program to remove intermediate 
// points in a linked list that represents
// horizontal and vertical line segments
using System;
      
public class LinkedList
{
    public Node head; // head of list
  
    /* Linked list Node*/
    public class Node
    {
        public int x,y;
        public Node next;
        public Node(int x, int y)
        {
            this.x = x;
            this.y = y;
            next = null;
        }
    }
  
    // This function deletes middle nodes in a sequence of
    // horizontal and vertical line segments represented
    // by linked list.
    private void delete_Middle_Nodes(Node head)
    {
        Node prev = head;
        Node temp = head.next;
  
        while (temp != null)
        {
  
            // checking equality of point x
            if (temp.x == prev.x)
            {
                Node curr = prev;
                prev = temp;
                temp = temp.next;
  
                // removing vertical points of line 
                // segment from linked list
                while (temp != null && temp.x == prev.x)
                {
                    curr.next = temp;
                    prev.next = null;
                    prev = temp;
                    temp = temp.next;
                }
            }
  
            // checking equality of point y 
            else if (temp.y == prev.y)
            {
                Node curr = prev;
                prev = temp;
                temp = temp.next;
  
                // removing horizontal points of line 
                // segment from linked list
                while (temp != null && temp.y == prev.y)
                {
                    curr.next = temp;
                    prev.next = null;
                    prev = temp;
                    temp = temp.next;
                }
            } 
            else
            {
                prev =temp;
                temp = temp.next;
            }
        }
    }
  
    /* Given a reference (pointer to pointer) to the head
        of a list and an int, push a new node on the front
        of the list. */
    void push(int x, int y)
    {
        /* 1 & 2: Allocate the Node &
                Put in the data*/
        Node new_node = new Node(x,y);
  
        /* 3. Make next of new Node as head */
        new_node.next = head;
  
        /* 4. Move the head to point to new Node */
        head = new_node;
    }
  
  
    void printList()
    {
        Node temp = head;
        while (temp != null)
        {
            Console.Write("(" + temp.x + "," + temp.y + ")->");
            temp = temp.next;
        }
        Console.WriteLine();
    }
  
  
    /* Driver code */
    public static void Main(String []args)
    {
        LinkedList llist = new LinkedList();
  
        llist.push(40,5);
        llist.push(20,5);
        llist.push(10,5);
        llist.push(10,8);
        llist.push(10,10);
        llist.push(3,10);
        llist.push(1,10);
        llist.push(0,10);
  
        Console.WriteLine("Given list");
        llist.printList();
  
        llist.delete_Middle_Nodes(llist.head);
  
        Console.WriteLine("Modified Linked List is");
        llist.printList();
    }
}
  
/* This code contributed by PrinciRaj1992 */

Javascript

<script>
  
// JavaScript program to remove intermediate 
// points in a linked list that represents
// horizontal and vertical line segments
  
var head = null; // head of list
  
/* Linked list Node*/
class Node
{
  
    constructor(x, y)
    {
        this.x =x;
        this.y = y;
        this.next = null;
    }
}
// This function deletes middle nodes in a sequence of
// horizontal and vertical line segments represented
// by linked list.
function delete_Middle_Nodes(head)
{
    var prev = head;
    var temp = head.next;
    while (temp != null)
    {
        // checking equality of point x
        if (temp.x == prev.x)
        {
            var curr = prev;
            prev = temp;
            temp = temp.next;
            // removing vertical points of line 
            // segment from linked list
            while (temp != null && temp.x == prev.x)
            {
                curr.next = temp;
                prev.next = null;
                prev = temp;
                temp = temp.next;
            }
        }
        // checking equality of point y 
        else if (temp.y == prev.y)
        {
            var curr = prev;
            prev = temp;
            temp = temp.next;
            // removing horizontal points of line 
            // segment from linked list
            while (temp != null && temp.y == prev.y)
            {
                curr.next = temp;
                prev.next = null;
                prev = temp;
                temp = temp.next;
            }
        } 
        else
        {
            prev =temp;
            temp = temp.next;
        }
    }
}
/* Given a reference (pointer to pointer) to the head
    of a list and an int, push a new node on the front
    of the list. */
function push(x, y)
{
    /* 1 & 2: Allocate the Node &
            Put in the data*/
    var new_node = new Node(x,y);
    /* 3. Make next of new Node as head */
    new_node.next = head;
    /* 4. Move the head to point to new Node */
    head = new_node;
}
function printList()
{
    var temp = head;
    while (temp != null)
    {
        document.write("(" + temp.x + ", " + temp.y + ") -> ");
        temp = temp.next;
    }
    document.write("<br>");
}
/* Driver code */
push(40,5);
push(20,5);
push(10,5);
push(10,8);
push(10,10);
push(3,10);
push(1,10);
push(0,10);
document.write("Given list:<br>");
printList();
delete_Middle_Nodes(head);
document.write("Modified Linked List is:<br>");
printList();
  
</script>

Producción:  

 
Given Linked List: 
(0, 10)-> (1, 10)-> (3, 10)-> (10, 10)-> (10, 8)-> (10, 5)-> (20, 5)-> (40, 5)-> 
Modified Linked List: 
(0, 10)-> (10, 10)-> (10, 5)-> (40, 5)-> 

Publicación traducida automáticamente

Artículo escrito por Ekta Goel 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 *