Leecode 25. K 个一组翻转链表

简介: Leecode 25. K 个一组翻转链表

题目描述:

给你一个链表,每 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];
        }
    }
}


相关文章
|
24天前
|
算法 Java C语言
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
10 1
|
1月前
|
算法
25. K 个一组翻转链表
25. K 个一组翻转链表
41 9
|
15天前
25. K个一组翻转链表
25. K个一组翻转链表
|
20天前
|
算法 数据挖掘 Python
LeetCode题目25 hard:K个一组翻转链表 【分治策略 Python】
LeetCode题目25 hard:K个一组翻转链表 【分治策略 Python】
|
24天前
|
算法
数据结构和算法学习记录——习题-翻转链表(不带表头结点逆置算法、带表头结点的链表逆置算法)
数据结构和算法学习记录——习题-翻转链表(不带表头结点逆置算法、带表头结点的链表逆置算法)
15 0
|
1月前
Leecode之反转链表
Leecode之反转链表
|
1月前
Leecode之合并两个有序链表
Leecode之合并两个有序链表
|
1月前
Leecode之分割链表
Leecode之分割链表
|
1月前
Leecode之环形链表进阶
Leecode之环形链表进阶
|
1月前
Leecode之相交链表
Leecode之相交链表