给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
- 最简单的是构建一个数组存储所有的节点 直接在数组上操作结点就可以了
/**
* 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) {
if (left >= right || head == null || null == head.next) {
return head;
}
List<ListNode> nodes = new ArrayList<>();
// 添加一个虚拟节点 方便处理边界问题
ListNode vir = new ListNode(-1, head);
nodes.add(vir);
ListNode cursor = head;
while (null != cursor) {
nodes.add(cursor);
cursor = cursor.next;
}
cursor = nodes.get(right).next;
for (int j = right; j > left; j --) {
nodes.get(j).next = nodes.get(j - 1);
}
nodes.get(left - 1).next = nodes.get(right);
nodes.get(left).next = cursor;
return vir.next;
}
}
- 顺序遍历 进入需要变更的区间时把当前节点的下一个节点插入到前置节点的后面
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if (left >= right || head == null || null == head.next) {
return head;
}
ListNode vir = new ListNode(-1, head);
ListNode cursor = vir;
int i ;
for (i = 0; i < left - 1; i++) {
cursor = cursor.next;
}
ListNode start = cursor;
cursor = cursor.next;
i = left;
ListNode next;
while (++i <= right) {
next = cursor.next;
cursor.next = next.next;
next.next = start.next;
start.next = next;
}
return vir.next;
}
}