一、题目:92. 反转链表 II
二、题目解析:
题目解析:改题需要先理解第206题反转链表,会更容易理解此题,此题只需要在反转链表的基础上进行很小变动,总体分为两大部
① 反转left到rignt的链表 1–>2–>3–>4–>5–>6–>7 预期变成 1–>2 3<–4<–5 6–>7
② 将反转后的链表与原链表拼接 将2指向5 3指向6
解题步骤:
- 定义三个指针同反转链表题
- 先遍历到要操作的结点
- 占住pre和curr的起始位置
- 开始反转链表、还是第一题的那四步
- 链表拼接
图示帮助理解:
三、代码如下:
可先查看反转链表第一题 力扣第206反转链表
public ListNode reverseBetween(ListNode head, int left, int right) {
//定义三个指针同反转链表题
ListNode curr = head;
ListNode next = null;
ListNode pre = null;
//先遍历到要操作的结点
for(int i = 1;i < left ;i++){
pre = curr;
curr = curr.next;
}
//占住pre和curr的起始位置
ListNode curr2 = curr;
ListNode pre2 = pre;
//开始反转链表
for(int i = left ; i <= right; i++){
//还是那四步
next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
//链表拼接 疑问点:为啥要有head = pre 这一步 ? 这里需要考虑到 left = 1的情况
//1.如果我们要反转的链表是出于中间的,则头部和尾部是不会变的 ,头部不会受影响,直接return head就可以
//2.假设left = 1 right = 5 那么则需要返回反转后的链表的头部 也就 5-->4-->3-->2-->1-->6-->7
//3.如果left是一个出于中间的位置,pre一定不等于null 否则,如果left = 1 的情况下 curr指向第一个结点 pre指向null结点
//4.所以可以以[pre2.next!=null]为条件来进行判断
if(pre2.next!=null){ //left>1也可以 一个意思
pre2.next = pre;
}else{
//头部设置为反转后的链表
head = pre;
}
curr2.next = curr;
return head;
}
四、测试
五、结束