package com.interview.leetcode.list; import com.interview.leetcode.utils.ListNode; /** * Created_By: stefanie * Date: 14-12-10 * Time: 下午5:31 */ public class ListReverser { public static ListNode reverse(ListNode node){ ListNode newHead = null; while(node != null){ ListNode next = node.next; node.next = newHead; newHead = node; node = next; } return newHead; } public static void reverse(ListNode node, ListNode tail, ListNode prev){ ListNode newHead = tail.next; while(newHead != tail){ ListNode next = node.next; node.next = newHead; newHead = node; node = next; } prev.next = newHead; } public ListNode reverseKGroup(ListNode head, int k) { //0->1->2->3->4->5 -> 0->2->1->4->3->5 if(head == null || k == 1) return head; ListNode dummyNode = new ListNode(0); dummyNode.next = head; ListNode prev = dummyNode; while(head != null){ int i = k; while(head != null && i > 1){ head = head.next; i--; } if(head == null) break; ListNode next = prev.next; reverse(prev.next, head, prev); //prev: 0, head: 2, prev.next = 2, next = 1 prev = next; head = prev.next; } return dummyNode.next; } public static ListNode reverseBetweenL(ListNode head, int m, int n){ ListNode dummyNode = new ListNode(0); dummyNode.next = head; ListNode prev = dummyNode; n = n - m + 1; while(m > 1){ head = head.next; prev = prev.next; m--; } ListNode tail = head; while(n > 1) { tail = tail.next; n--; } ListNode newNode = tail.next; while(newNode != tail){ ListNode next = head.next; head.next = newNode; newNode = head; head = next; } prev.next = newNode; return dummyNode.next; } public static ListNode reverseBetween(ListNode head, int m, int n) { ListNode fakeHead = new ListNode(0); fakeHead.next = head; reverseBetween(head, m, n, 1, fakeHead); return fakeHead.next; } private static ListNode reverseBetween(ListNode node, int m, int n, int count, ListNode prev){ if(count < m){ reverseBetween(node.next, m, n, count + 1, node); } else if(count >= m && count < n){ prev = reverseBetween(node.next, m, n, count + 1, prev); prev.next = node; } else if(count == n){ prev.next.next = node.next; prev.next = node; } return node; } }