LeetCode----K 个一组翻转链表

复制代码
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

 

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 
复制代码

 

思路:比如1->2->3->4->5,k=3;

先找到3和4的位置,然后断开,在把3前面的反转(这时候知道1和3节点)

把4后面的递归

把3节点和后面的节点连接起来

 

复制代码
    /****
     * K 个一组翻转链表
     * pre k=3时
     * 1->2->3->4->5->6->7->8
     * after:
     * 3->2->1->6->5->4->7->8
     ** */
    public static ListNode reverseKGroup(ListNode head, int k) {
        ListNode temp = head;
//       先用temp找到3的位置,不足,就返回head不反转
        for(int i=1;i<k && temp!=null;i++){
            temp=temp.next;
        }
        if (temp == null) return head;
//        用t2记录记录4的位置,把三四断开
        ListNode  t2 = temp.next;
        temp.next=null;
//        反转前部分,头部设置为newHead,此时head在3的位置了
        ListNode newHead = reListNode(head);
//        把1-2-3与后面的连接起来,后面的继续递归:head.next=reverseKGroup(t2,k);
        head.next=reverseKGroup(t2,k);
        return newHead;
    }
复制代码

 

具体代码

复制代码
public class ListNode {
    int value;
    public ListNode(int value){
        this.value=value;
    }
    ListNode next =null;
}




public class TestListNode {

    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        head.next=new ListNode(2);
        head.next.next= new ListNode(3);
        head.next.next.next=new ListNode(4);
        head.next.next.next.next=new ListNode(5);
        head.next.next.next.next.next=new ListNode(6);
        head.next.next.next.next.next.next=new ListNode(7);
        head.next.next.next.next.next.next.next=new ListNode(8);
        System.out.println("pre");
        printListNode(head);
        ListNode after = reverseKGroup(head,3);
        System.out.println("after:");
        printListNode(after);
    }

    /****
     * K 个一组翻转链表
     * pre k=3时
     * 1->2->3->4->5->6->7->8
     * after:
     * 3->2->1->6->5->4->7->8
     ** */
    public static ListNode reverseKGroup(ListNode head, int k) {
        ListNode temp = head;
//       先用temp找到3的位置,不足,就返回head不反转
        for(int i=1;i<k && temp!=null;i++){
            temp=temp.next;
        }
        if (temp == null) return head;
//        用t2记录记录4的位置,把三四断开
        ListNode  t2 = temp.next;
        temp.next=null;
//        反转前部分,头部设置为newHead,此时head在3的位置了
        ListNode newHead = reListNode(head);
//        把1-2-3与后面的连接起来,后面的继续递归:head.next=reverseKGroup(t2,k);
        head.next=reverseKGroup(t2,k);
        return newHead;
    }

    private static ListNode reListNode(ListNode head){
        ListNode next=null;
        ListNode pre=null;
        while (head!=null){
            next=head.next;
            head.next=pre;
            pre=head;
            head=next;

        }
        return pre;
    }

    private static void printListNode(ListNode node){
        ListNode temp=node;
        while (temp.next!=null){
            System.out.print(temp.value+"->");
            temp=temp.next;

        }
        if (temp!=null){
            System.out.println(temp.value);
        }
    }
}
View Code
复制代码

 

 

posted on   Honey_Badger  阅读(292)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
github
点击右上角即可分享
微信分享提示