题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
public ListNode reverseKGroup (ListNode head, int k) { // write code here if (head == null){ return null; } //len记录链表长度 int len = 0; //eg用于遍历链表 ListNode eg = head; while (eg != null){ len++; eg = eg.next; } if (len < k){ //如果长度小于k,返回当前链表 return head; } int num = len / k; //ListNode用于标记每一组的第一个节点 ListNode headeg = head; //eg用于记录每一组翻转后的最后一个节点 eg = head; for (int i = 1; i <= num; i++){ //为每一组的翻转做准备工作 ListNode eg0 = headeg; ListNode eg1 = headeg.next; headeg.next = null; int egi = k; while(egi - 1!= 0){ //对每一组进行翻转 egi--; ListNode eg2 = eg1.next; eg1.next = headeg; headeg = eg1; eg1 = eg2; } if (i == 1){ //移动头节点,使其指向翻转后的第一个节点,只能在第一次翻转时执行一次 head = headeg; }else{ //连接翻转后的前一组与翻转后的当前组 eg.next = headeg; eg = eg0; } //连接翻转后的当前组与下一组 eg0.next = eg1; //使headeg始终指向下一组的头节点 headeg = eg1; } return head; }
主要思路是先获取链表长度,根据k值确定每一组有几个节点以及总共有几个组,然后从左往右依次操作链表中的节点。共遍历代码两次,一次用于记录链表长度,一次用于翻转链表。具体细节请看代码中的注释。