相关标签
一、题目要求
二、题解和代码实现
1.题解
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 demp = new ListNode(-1);//创建头节点
demp.next= head;
ListNode pre =demp;//创建要反转链表的首元素的前驱
for (int i = 0; i < left-1; i++) {//因为有头节点,加上i从0开始,所以终止条件为left-1
//i从1开始,终止条件为left
pre =pre.next;
}
ListNode leftNode = pre.next;//记录要反转链表的首元素的位置
ListNode rightNode= pre;//记录要反转链表的尾元素的位置,初始化为要反转链表的首元素的前驱
for (int i = 0; i < right - left + 1; i++) {//i从0开始和初始化为要反转链表的首元素的前驱,所以终止条件为right - left + 1
//i从1开始就要+2
rightNode = rightNode.next;
}
ListNode cuss = rightNode.next;//创建要反转链表的尾元素的后继位置
//切断要反转链表的链接
pre.next = null;
rightNode.next= null;
//反转链表的子区间
reverseLinkedList(leftNode);
//链接回切断的链表
pre.next = rightNode;//这时候rightNode为首元素
leftNode.next=cuss;//leftNode为尾元素
return demp.next;
}
private void reverseLinkedList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur!=null){
ListNode temp= cur.next;
cur.next =pre;
pre = cur;
cur = temp;
}
}
}