题目:将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表。如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样,你不能更改节点中的值,只能更改节点本身。
解题思路:首先找到startNode 分组开始节点 然后开始节点之前的节点 preNode 分组末尾节点 endNode 以及末尾节点的下一个节点
循环判断条件是当endNode为空时,则说明分组不足k个,就不需要反转,则结束。
循环内部:首先是定义哨兵节点dummy preNode startNode 根据for循环找到endNode以及结尾节点的下一个节点next。总的来说就相当于 每次分组有效的情况下,将要反转的部分与前后不需要反转的两部分先分割开,中间部分反转结束以后再连接上。然后再去找下一个个数为k的分组。
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
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode preNode = dummy;
ListNode endNode = dummy;
while(endNode != null){
ListNode startNode = preNode.next;
for(int i=0;i<k&&endNode!=null;i++){
endNode = endNode.next;
}
if(endNode == null) break;
ListNode next = endNode.next;
preNode.next = null;
endNode.next = null;
preNode.next = reverse(startNode);
startNode.next = next;
preNode = startNode;
endNode = preNode;
}
return dummy.next;
}
public ListNode reverse(ListNode head){
ListNode pre = null;
ListNode curr = head;
while(curr != null){
ListNode memo = curr.next;
curr.next = pre;
pre = curr;
curr = memo;
}
return pre;
}
}