430.flatten-a-multilevel-doubly-linked-list.java 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public int val;
  5. public Node prev;
  6. public Node next;
  7. public Node child;
  8. public Node() {}
  9. public Node(int _val,Node _prev,Node _next,Node _child) {
  10. val = _val;
  11. prev = _prev;
  12. next = _next;
  13. child = _child;
  14. }
  15. };
  16. */
  17. class Solution {
  18. public Node flatten(Node head) {
  19. recurse(head);
  20. return head;
  21. }
  22. private Node recurse(Node node) {
  23. Node prev = node;
  24. while (node != null) {
  25. if (node.child == null) {
  26. prev = node;
  27. node = node.next;
  28. } else {
  29. prev = recurse(node.child);
  30. prev.next = node.next; // Double linked list, both next and prev should be modified!
  31. if (prev.next != null) prev.next.prev = prev;
  32. node.next = node.child;
  33. node.child.prev = node;
  34. node.child = null;
  35. node = prev.next;
  36. }
  37. }
  38. return prev; // Return the last node of flatten list.
  39. }
  40. }