题目描述
给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
样例
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
做链表题目的关键是 画图、画图、画图!
解决链表翻转类问题的思路:需要3个pointer辅助
1.数组记录并交换存储的值
Java 代码
/**
* 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 {
ListNode[] list = new ListNode [505];
int idx = 1;
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode h = head;
int mid = (left + right) / 2;
if ((left + right) % 2 == 0) {
for (int i = 1; i <= right; i ++ , h = h.next) {
if (i >= left && i < mid) {
list[idx ++ ] = h;
}
else if (i > mid) {
int x = idx - (i - mid);
int temp = list[x].val;
list[x].val = h.val;
h.val = temp;
}
}
} else {
for (int i = 1; i <= right; i ++ , h = h.next) {
if (i >= left && i <= mid) {
list[idx ++ ] = h;
}
else if (i > mid) {
int x = idx - (i - mid);
int temp = list[x].val;
list[x].val = h.val;
h.val = temp;
}
}
}
return head;
}
}
2.节点指针反向操作
Java 代码
/**
* 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 dummy = new ListNode(-1);
dummy.next = head;
ListNode a = dummy;
for (int i = 0; i < left - 1; i ++ ) a = a.next; // left的前一个节点
ListNode b = a.next; // left
ListNode c = b.next;
for (int i = 0; i < right - left; i ++ ) {
ListNode t = c.next;
c.next = b;
b = c;
c = t;
}
a.next.next = c;
a.next = b;
return dummy.next;
}
}