前言
今天的题目出自力扣,最近正好在刷力扣,感觉java写起来更加顺手,所以就用java啦
🙎作者简介:一个正在努力学算法和后端的girl
🍅联系方式:157543570(qq)
今日题目
92. 反转链表 II - 力扣(LeetCode) (leetcode-cn.com)
🌰思路:虽然会写反转链表的基础代码,不过这道题还是看了好一会儿题解。需要注意的就是将子链表从链表中截取下来时,一定要将前驱结点和子链表的尾结点的next域置空!!
🌰AC代码:
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummyNode=new ListNode(-1);
dummyNode.next=head;
//从头结点走left-1步,来到left节点的前一个节点pre
ListNode pre=dummyNode;
for(int i=0;i<left-1;i++)
pre=pre.next;
//left节点是pre节点的下一个节点
ListNode leftNode=pre.next;
//从pre节点走right-left+1步,来到right节点
ListNode rightNode=pre;
for(int i=0;i<right-left+1;i++)
rightNode=rightNode.next;
//succ节点是right节点的下一个节点
ListNode succ=rightNode.next;
//将left-right之间的节点从链表中截下来
rightNode.next=null;
pre.next=null;
//反转子链表,并将结果返回给right节点
rightNode=reverseList(leftNode);
//将反转后的子链表接回到原链表中
pre.next=rightNode;
leftNode.next=succ;
return dummyNode.next;
}
private ListNode reverseList(ListNode head){
ListNode pre=null,cur=head;
while(cur!=null){
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}