链表(四)— K个节点的组内逆序调整
测试链接:https://leetcode.com/problems/reverse-nodes-in-k-group/
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public ListNode reverseKGroup(ListNode head, int k) {
ListNode start = head;
ListNode end = getKGroupEnd(start, k);
if (end == null){
return head;
}
//第一组
head = end;
reverse(start,end);
//上一组的结尾节点
ListNode lastEnd = start;
while (lastEnd != null){
start = lastEnd.next;
end = getKGroupEnd(start, k);
if (end == null){
return head;
}
reverse(start, end);
lastEnd.next = end;
lastEnd = start;
}
return head;
}
public static ListNode getKGroupEnd(ListNode start, int k){
while (--k != 0 && start != null) {
start = start.next;
}
return start;
}
public void reverse(ListNode start, ListNode end){
end = end.next;
ListNode pre = null;
ListNode cur = start;
ListNode next = null;
while (cur != end){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
start.next = end;
}