K 个一组翻转链表
/** * Definition for singly-linked list. * 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; } * } */
class Solution {
//反转整条链表的操作 public ListNode reverseKGroup(ListNode head, int k) {
//记录头结点,因为头结点要指向第一组k个节点的尾节点 ListNode start=head; ListNode end=getEndNode(start,k);
//如果第一组都不满足k个 if(end==null){ return head; }
//头结点指向第一组链表的尾节点 head=end;
//反转 reverse(start,end);
//记录第一组的开始节点,因为在以后的每一组反转之前都要先搜索到该组的起始节点和终止节点,即需要记录第一组节点的起始节点第二组开始时的起始节点需要重寻 ListNode lastnode=start; while(lastnode!=null){
//新的起始节点变为上一次的end节点的下一个节点 start=lastnode.next; end=getEndNode(start,k); if(end==null){ return head; } reverse(start,end); lastnode.next=end; lastnode=start; } return head; }
//取以k为一组的链表的结尾 public static ListNode getEndNode(ListNode start,int k){ while(--k!=0&&start!=null){ start=start.next; } return start; }
//反转子链表 public static void reverse(ListNode start ,ListNode end){ end=end.next; ListNode pre=null; ListNode cur=start; ListNode next=null; while(cur!=null){ next=cur.next; cur.next=pre; pre=cur; cur=next; } start.next=end; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人