【反转子链表】模拟题
题意:反转链表的[left, right],返回链表表头
题解:直接模拟删除的过程即可
-
定义重要节点
记录left位置的节点为lnode,right位置的节点为rnode
lnode的前驱节点为pre,right位置的后继节点为suc
初始化pre = suc = lnode = rnode = 原链表表头前的虚拟节点 -
使节点从虚拟节点走到定义的位置
pre跳l-1次走到自己的位置
lnode再从pre跳1次走到自己的位置
rnode从lnode跳r-l次走到自己的位置
suc从rnode跳1次走到自己的位置 -
反转[left, right]处的链表
-
修改pre和lnode的next节点
pre.next = reverse(lnode);
lnode.next = suc;
模拟代码
/** * 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 { ListNode pre, suc, lnode, rnode; public ListNode reverseBetween(ListNode head, int left, int right) { ListNode dummy = new ListNode(0, head); pre = suc = lnode = rnode = dummy; int t = left - 1; while(t -- > 0) { pre = pre.next; } lnode = pre.next; rnode = lnode; t = right - left; while(t -- > 0) { rnode = rnode.next; } suc = rnode.next; pre.next = reverse(lnode); lnode.next = suc; return dummy.next; } public ListNode reverse(ListNode head) { if(head == rnode) return head; ListNode res = reverse(head.next); head.next.next = head; head.next = null; return res; } }
题解2:在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。将需要反转的子链表依次移动到pre节点的后面
-
定义重要节点
pre:子链表[left, right]的前驱节点
lnode:子链表[left, right]的表头节点
suc:lnode节点的后继节点【永远指向lnode的下一个节点】 -
更改第1步中三个节点的指向
(1)lnode.next = suc.next
(2)suc.next = pre.next
(3)pre.next = suc -
更新suc节点
suc = lnode.next -
边界条件
lnode跳r-l次 [或者] lnode.next==null
题解2代码
/** * 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 reverseBetween(ListNode head, int left, int right) { ListNode pre, lnode, suc; ListNode dummy = new ListNode(0, head); pre = lnode = suc = dummy; int t = left - 1; while(t -- > 0) { pre = pre.next; } lnode = pre.next; suc = lnode.next; t = right - left; while(t -- > 0) { if(lnode.next == null) { break; } else { lnode.next = suc.next; suc.next = pre.next; pre.next = suc; suc = lnode.next; } } return dummy.next; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效