1 2 3 4 5 6 7 8 9 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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| package com.demo.s25;
import java.util.ArrayList; import java.util.List;
class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } } public class Solution { class Pharse { ListNode begin; ListNode end; boolean reverse;
public Pharse(ListNode begin, ListNode end, boolean reverse) { this.begin = begin; this.end = end; this.reverse = reverse; }
public void reverseSubGroup() { ListNode pre = null; ListNode cur = begin; while(true) { ListNode tmp = cur.next; cur.next = pre; pre = cur; if(cur == end || tmp == null){ break; } else { cur = tmp; } } ListNode tmp = begin; begin = end; end = tmp; } }
public ListNode reverseKGroup(ListNode head, int k) { if(k == 1) { return head; } ListNode pre = new ListNode(0); ListNode cur = head; boolean flag = false; List<Pharse> pharses = new ArrayList<>(); ListNode start = null; ListNode end = null; for(int i = 0; cur != null; i++) { if(i % k == 0 && !flag) { start = cur; flag = true; if(cur.next == null) { end = cur; pharses.add(new Pharse(start, end, false)); } } else if((i + 1) % k == 0 && flag) { end = cur; flag = false; pharses.add(new Pharse(start, end, true)); } else if(cur.next == null) { end = cur; pharses.add(new Pharse(start, end, false)); } cur = cur.next; } ListNode ph = pre; for(Pharse pharse : pharses) { if(pharse.reverse) { pharse.reverseSubGroup(); } ph.next = pharse.begin; ph = pharse.end; }
return pre.next;
} }
|