题目:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
该题是部分反转链表,也就是指定位置进行反转
反转链表思路:
1.新建一个链表,把原链表的末结点插入到新链表头结点
2.不建立新链表的话,将遍历向后,将后一个结点插入自身头结点之前。
即:1 2 3 4 5 -> 2 1 3 4 5 -> 3 2 1 4 5 -> 4 3 2 1 5 -> 5 4 3 2 1
那么部分反转的话,只需要遍历向后,将后一个结点插入left的上一个结点(新建p利用循环指向) 之后
上面所说的后一节点即nex(nex = head.next),将nex插入到p(1)的后面
可以看出此时的head依旧是2,所以此时将head.next(即4)插入到1后面
要注意的是:如果left刚好是1,那么p无法指向头结点的前一个。那么我们首先创建一个带头结点的链表(q),使其下一个指向原head。那么p = q 然后开始遍历到left之前。不管left是不是等于1,前面都有一个空节点。
public static ListNode reverseBetween(ListNode head, int left, int right) {
if(head==null || left>right) return head;
ListNode q = new ListNode();
q.next = head;
ListNode p = q;
for(int i=1;i<left;i++){
p = p.next;
}
System.out.println(p.val);
head = p.next;
for(int i=left;i<right;i++){
ListNode nex = head.next;
head.next = nex.next;
nex.next = p.next;
p.next = nex;
}
return q.next;
}