题目描述
思路:同LeetCode25. K个一组翻转链表
- 因为涉及到可能链表的头节点会改变,所以设置dummy节点
- 先走left - 1步到达left的左边一个节点
- 查看后面是否存在right - left + 1个节点
- 先翻转内部节点指向right - left次
- 再翻转外部节点
方法一:
/**
* 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) {
// 因为涉及到可能链表的头节点会改变,所以设置dummy节点
ListNode dummy = new ListNode(0, head);
ListNode cur = dummy;
// 先走left - 1步到达left的左边一个节点
for (int i = 0; i < left - 1; i ++) {
cur = cur.next;
}
// 查看后面是否存在right - left + 1个节点
ListNode p = cur;
for (int i = 0; i < right - left + 1 && p != null; i ++) {
p = p.next;
}
if (p == null) return null;
ListNode node1 = cur.next;
ListNode node2 = cur.next.next;
// 先翻转内部节点指向right - left次
for (int i = 0; i < right - left; i ++) {
ListNode temp = node2.next;
node2.next = node1;
node1 = node2;
node2 = temp;
}
// 再翻转外部节点
ListNode temp = cur.next;
cur.next = node1;
temp.next = node2;
return dummy.next;
}
}
标签:II,ListNode,cur,int,LeetCode92,next,链表,节点,left
From: https://www.cnblogs.com/keyongkang/p/17898310.html