Reverse List , Reverse List in Pairs, Reverse List in K-Pairs
|1. Reverse List in place, Time : O(n) and Space : O(1).
2. Reverse List in Pairs in place, Time : O(n) and Space : O(1).
3. Reverse List in K-Pairs in place : O(n) and Space : O(1),
Reverse List is main algo, using that rest of the problems can be easily solved.
Solution 1: As shown in the below pic,
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | package com.rrohit.algo.linkedlist; public class ReverseList { public Node reverseList(Node head) { if (head == null ) { return null ; } Node nextNode = null , prevNode = null , current= head;; while (current != null ) { nextNode = current.getNext(); current.setNext(prevNode); prevNode = current; current = nextNode; } return prevNode; } public <T>Node<T> reverseListInPairs(Node<T> head){ if (head== null || head.getNext() == null ) { return head; } Node<T> current = head, temp = null , temp2 = null , prev = null ; head = head.getNext(); while (current!= null && current.getNext() != null ) { temp = current.getNext(); temp2 = temp.getNext(); temp.setNext(current); current.setNext(temp2); //prev will be used in 2nd pair onwards if (prev != null ) { prev.setNext(temp); } prev = current; current = current.getNext(); } return head; } public <T>Node<T> reverseListInK(Node<T> head, int k){ Node<T> current = head, prev = null , nextNode = null ; int count = 0 ; while (current != null && count<k) { nextNode = current.getNext(); current.setNext(prev); prev = current; current = nextNode; count++; } if (nextNode != null ) { head.setNext(reverseListInK(nextNode, k)); } return prev; } public static void main(String[] args) { LinkedList<Integer> list = new LinkedList<Integer>(); for ( int i= 1 ; i< 6 ; i++) { list.add(i); } list.display(); ReverseList rl = new ReverseList(); /*Node head = rl.reverseList(list.getHead()); list.setHead(head); list.display();*/ list.display(); /*Node head1 = rl.reverseListInPairs(list.getHead()); list.setHead(head1); list.display();*/ Node head1 = rl.reverseListInK(list.getHead(), 3 ); list.setHead(head1); list.display(); } } |