反转链表II
题目
92. 反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
进阶: 你可以使用一趟扫描完成反转吗?
题解
题解一
转换为数组再进行处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| public class ReverseBetween {
public static void main(String[] args) { ListNode node = new ListNode(1); node.next = new ListNode(2); node.next.next = new ListNode(3); node.next.next.next = new ListNode(4); node.next.next.next.next = new ListNode(5); ListNode node1 = reverseBetween(node, 2, 4); while (node1 != null) { System.out.println(node1.val); node1 = node1.next; } }
public static ListNode reverseBetween(ListNode head, int m, int n) { if (m == n || head == null || head.next == null) { return head; }
List<Integer> list = new ArrayList<>(); while (head != null) { list.add(head.val); head = head.next; } int start = m - 1; int end = n - 1;
while (start < end) { Integer i = list.get(start); Integer j = list.get(end); list.set(start, j); list.set(end, i); start++; end--; }
ListNode result = null; ListNode item = null; for (Integer integer : list) { if (result == null) { result = new ListNode(integer); item = result; }else{ item.next = new ListNode(integer); item = item.next; } } return result; }
}
|

题解二(进阶 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { ListNode dummyNode = new ListNode(-1); dummyNode.next = head; ListNode pre = dummyNode; for (int i = 0; i < left - 1; i++) { pre = pre.next; } ListNode cur = pre.next; ListNode next; for (int i = 0; i < right - left; i++) { next = cur.next; cur.next = next.next; next.next = pre.next; pre.next = next; } return dummyNode.next; } }
|