题解 | #链表中的节点每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;
}
}
传音控股公司福利 356人发布