题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ public ListNode reverseKGroup (ListNode head, int k) { // write code here // 通过递归的思路:将反转的几个子区间每个当作一个递归来做 // 每次找到一个子区间的尾部,当作反转的终止条件 // 然后对每个子区间使用头插法插入,长度不足k的子区间直接返回head // 每次找到反转区间的尾部 ListNode tail = head; // 遍历k次到区间尾部 for(int i=0; i<k; i++) { // 如果不足k次就到了链表尾,直接返回head,不反转 if(tail == null){ return head; } // tail 后移 tail = tail.next; } // 翻转时需要前序和当前结点 ListNode pre = null; ListNode cur = head; // 在达到当前段尾结点前 while(cur != tail) { // 翻转 ListNode temp = cur.next; // 防断链 cur.next = pre; // 新遍历到的结点指向头 pre = cur; // 令pre为头指针 cur = temp; // 遍历下标后移 } // 当前尾指针指向下一个子区间头部 // 因为反转了,所以head跑最尾部了 head.next = reverseKGroup(tail, k); return pre; } }