package com.anuragkapur.pie.linkedlists; /** * Status: Untested * @author anuragkapur */ public class ListFlattening { public void flatten(DoublyLinkedListWithChildElement<Integer> head, DoublyLinkedListWithChildElement<Integer> tail) { DoublyLinkedListWithChildElement<Integer> current = head; while (current != null) { if (current.getChild() == null) { current = current.getNext(); } else { DoublyLinkedListWithChildElement<Integer> child = current.getChild(); DoublyLinkedListWithChildElement<Integer> tailOfChildSubList = flattenAndGetTail(child); tailOfChildSubList.setNext(current.getNext()); current.setNext(child); } } } private DoublyLinkedListWithChildElement<Integer> flattenAndGetTail(DoublyLinkedListWithChildElement<Integer> child) { DoublyLinkedListWithChildElement<Integer> current = child; DoublyLinkedListWithChildElement<Integer> tail = child; while (current != null) { tail = current; if (current.getChild() == null) { current = current.getNext(); } else { // TODO: possible null conditions / corner cases when last node of has children DoublyLinkedListWithChildElement<Integer> subTail = flattenAndGetTail(current.getChild()); subTail.setNext(current.getNext()); current.setNext(current.getChild()); current = subTail.getNext(); } } return tail; } }