Skip to content
Related Articles
Iterative approach for removing middle points in a linked list of line segements
• Difficulty Level : Easy
• Last Updated : 26 Nov, 2019

This post explains the iterative approach of this problem.
We maintain two pointers, prev and temp. If these two have either x or y same, we move forward till the equality holds and keep deleting the nodes in between. The node from which the equality started, we adjust the next pointer of that node.

## C++

 `// C++ program to remove intermediate ``// points in a linked list that represents``// horizontal and vertical line segments``#include ``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 equlity 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 equlity 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 equlity 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 equlity 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 equlity 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 equlity 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 equlity 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 equlity 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 */`

Output:

```
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)->
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live

My Personal Notes arrow_drop_up