题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
解题思想:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseKGroup(ListNode head, int k) { if(k==1){ //如果k=1那么就是直接头节点反转就可以了 return head; } //定义一个ListNode类型长度为k的list数组 ListNode []list = new ListNode[k]; //初始化len = 0,用它不断递增靠近第k个结点 int len = 0; //只要不为空,那就可以一直从头节点开始循环遍历到第k个结点都存储到list数组中 for(;len<k && head!=null;len++) { list[len] = head; head = head.next; } //如果上面是因为结点还没到第k个,但是已经有结点为null的情况,那么我们就直接返回头部结点就可以了 if(len<k) { return list[0]; }else {//否则就继续下面的操作 //这里要注意,由于我们设置的是从第0个开始的,因此这个的i是从第k-1开始,即此时已经是从第k个结点开始往回翻转 for(int i=k-1;i>0;i--) { list[i].next = list[i-1]; } //翻转完前面k个结点以后,我们需要将这些返回值赋值给当前头结点的下一个 list[0].next=reverseKGroup(head,k); //返回此时的list[k-1]即为链表的头结点 return list[k-1]; } } }