解题思路:
- 定义一个新的结点list,永远放在第一个,便于找到链表的头结点
- 定义pre指针指向list,定义cru指针指向head指向的结点(后续会使用head指针来找链表长度,所以head不会是一直指向头结点),定义temp指针
- 利用head指针找到链表长度,确定循环次数
- 确定两层循环,第一层确定反转次数,第二层确定反转k个结点
- temp指向头节点下一个,pre.next指向反转的最后一个节点(反转后,最后一个节点变成第一个),cru.next指向temp.next(反转后最后一个节点跟下一次反转第一个节点连接),temp.next指向pre.next(一定要是pre的下一个,而不是cru,如果k为3的话,就会出错)
- 反转完一次之后,将pre指向cru的节点,将cru继续指向下一次反转的第一个节点(cru=cru.next)
易错点:
这里是pre.next,不是cru
当k = 3时,反转1、2、3
假设是temp.next = cru
则:
第一次反转:2、1、3(pre指向list节点,temp指向2,cru指向1)
第二次反转:
就会导致2这个节点找不到了
最后的结果就是:3,1(图中最开始的1是我的头节点list,其实是0,我标错了)
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if(k < 2||head == null ||head.next == null){
return head;
}
//新建一个节点,方便后续找到链表的头结点
ListNode list = new ListNode(0);
list.next = head;
ListNode pre = list;
ListNode cru = head;//保存最开始的头结点
ListNode temp = null;
int len = 0;
while(head != null){
len++;
head = head.next;
}
for(int i=0; i<len/k; i++){
for(int j=1; j<k; j++){
temp = cru.next;
cru.next = temp.next;
temp.next = pre.next;
pre.next = temp;
}
pre = cru;
cru = cru.next;
}
return list.next;
}
}