[LeetCode]92. 反转链表 II
题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
题解
-
核心反转的部分和反转链表每k个节点是相同的。抽象为反转beg到end ,并连接l、r,即需要参数(l,beg,end,r。);pre初始化为beg,cur初始化为end,前提是保证beg end部分至少有两个节点。然后反转内部用反转的三个指针的方法走即可。
-
为了保证区间反转代码至少含含两个节点(m<n),m==n特例直接return。
-
加一个临时头节点。
-
综上。1 判m==n;2 加临时头节点;3 找到l的位置 4 初始化lNext位置(为连接两端准备),初始化pre、cur、next,然后开始区间反转。
代码
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Main {
public static void main(String args[]) {
//test
ListNode n1=new ListNode(1);
ListNode n2=new ListNode(2);
ListNode n3=new ListNode(3);
ListNode n4=new ListNode(4);
ListNode n5=new ListNode(5);
n1.next=n2;
n2.next=n3;
n3.next=n4;
n4.next=n5;
ListNode head=n1;
ListNode newHead=reverseBetween(head,2,4);
ListNode pNode=newHead;
while(pNode!=null) {
System.out.println(pNode.val);
pNode=pNode.next;
}
}
public static ListNode reverseBetween(ListNode head, int m, int n) {
if(m==n){
return head;
}
ListNode tempHead=new ListNode(-1);
tempHead.next=head;
ListNode l=tempHead;
for(int i=1;i<m;++i){
l=l.next;
}
ListNode pre=l.next; ListNode lNext=l.next;
ListNode cur=pre.next;
ListNode next=null;
for(int i=m;i<n;++i){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
l.next=pre;
lNext.next=cur;
return tempHead.next;
}
}
posted on 2019-07-20 15:40 coding_gaga 阅读(125) 评论(0) 编辑 收藏 举报
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步