算法通关村第三关——K个一组反转
k个一组反转
题目:LeetCode25 k个一组反转
思路:分组实现,留好前后的节点信息,用头插法和穿针进行实现
解法:
-
头插法
/** * 总共两种方法 1.头插法 2.穿针引线法,以下是头插法 * @param head * @param k * @return */ public ListNode reverseKGroup(ListNode head, int k) { //1.创建虚拟节点 ListNode dummy = new ListNode(-1); dummy.next = head; ListNode lenCount = head; //2.统计元素数量len int len = 0; while (lenCount!=null){ len++; lenCount = lenCount.next; } //3.分组循环反转 ListNode pre = dummy; for (int i = 0; i < len / k; i++) { ListNode cur = pre.next; for (int i1 = 0; i1 < k-1; i1++) { ListNode next = cur.next; cur.next = cur.next.next; next.next = pre.next; pre.next = next; } //pre移到下组之前 for (int i1 = 0; i1 < k; i1++) { pre = pre.next; } } return dummy.next; }
-
穿针引线法
/** * 总共两种方法 1.头插法 2.穿针引线法,以下是穿针引线法 * @param head * @param k * @return */ public ListNode reverseKGroup2(ListNode head, int k) { //1.创建虚拟节点 ListNode dummy = new ListNode(-1); dummy.next = head; ListNode lenCount = head; //2.统计元素数量len int len = 0; while (lenCount!=null){ len++; lenCount = lenCount.next; } //3.分组循环反转(总共反转len / k次) ListNode pre = dummy; for (int i = 0; i < len / k; i++) { //找到4个关键位置 ListNode start = pre.next; ListNode end = start; for (int i1 = 0; i1 < k-1; i1++) { end = end.next; } ListNode next = end.next; end.next = null; //开始穿针引线进行反转 ListNode prev = start; ListNode cur = start.next; for (int i1 = 0; i1 < k-1; i1++) { ListNode curNext = cur.next; cur.next = prev; prev = cur; cur = curNext; } pre.next = end; start.next = next; //pre移动到新组的头节点的前一个节点 for (int i1 = 0; i1 < k; i1++) { pre = pre.next; } } return dummy.next; }