leetcode:链表倒转

92.反转链表2

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

示例 1:

img

1
2
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

1
2
输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

0x3f:

关键性质:

![屏幕截图 2025-06-28 091618](..\img\屏幕截图 2025-06-28 091618.png)

将内部的倒转之后,还需要处理![屏幕截图 2025-06-28 091811](..\img\屏幕截图 2025-06-28 091811.png)两端的节点:

1
2
p0.next.next = curr;
p0.next = pre;

如果left =1;如何解决?

注意:题目给出的是无头结点的链表,因此我们可以认为给他多设置一个链表头节点:

image-20250628092446549

p0节点不参与,先处理下方的p0的next的next,再处理p0的next

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
/**
* 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(0,head);
ListNode p0=dummy; //head节点
for(int i=0;i<left-1;i++){
p0 =p0.next;
}
ListNode pre =null;
ListNode curr =p0.next;
for(int i=0;i<right-left+1;i++){
ListNode nxt =curr.next; //内部反转
curr.next = pre;
pre = curr;
curr = nxt;
}
p0.next.next = curr; //先处理内部的头节点,使其指向外部2号的头
//先处理next的next,否则next就失踪了
p0.next = pre; //处理p0(外部1号)的头
return dummy.next;
}
}

leetcode:链表倒转
http://example.com/2025/06/28/leetcode:链表倒转/
作者
無鎏雲
发布于
2025年6月28日
许可协议