package com.interview.algorithms.list; import com.interview.basics.model.collection.list.Node; /** * Created_By: stefanie * Date: 2/22/14 * Time: 6:52 PM * * Write a routine to reverse every k nodes in a given linked list without using additional memory. * * input : 1,2,3,4,5,6 k:3 output: 3,2,1,6,5,4 */ public class C3_5_ReverseLinkedListWithStepK { public static Node reverse(Node head, int k) { if(k <= 1) return head; Node newHead = new Node(0); newHead.next = head; Node p = newHead; Node q = newHead; int counter = 0; while(q.next != null){ //find the begin and end, then reverse the node between them counter = 0; while(q.next != null && counter < k - 1) { q = q.next; counter++; } if(q.next == null) break; //reverse element between p.next ~ q.next; tracking prev and next node Node next = q.next.next; Node prev = p.next; p.next = q.next; reverse(prev, q.next); prev.next = next; p = prev; q = prev; } return newHead.next; } private static Node reverse(Node current, Node tail){ if(current.next == tail) tail.next = current; else reverse(current.next, tail).next = current; return current; } public static Node reverseUsingBetween(Node head, int k){ if(k <= 1) return head; Node newHead = new Node(0); newHead.next = head; Node prev = newHead; Node next = head; while(next != null){ prev = reverseBetween(next, 1, k, 1, prev); if(prev == null) next = null; else next = prev.next; } return newHead.next; } private static Node reverseBetween(Node node, int m, int n, int count, Node prev){ //reverse m - n start from node if(count < m){ if(node.next == null) return null; reverseBetween(node.next, m, n, count + 1, node); } else if(count >= m && count < n){ if(node.next == null) return null; prev = reverseBetween(node.next, m, n, count + 1, prev); if(prev == null) return null; prev.next = node; } else if(count == n){ prev.next.next = node.next; prev.next = node; } return node; } }