https://leetcode-cn.com/problems/reverse-linked-list-ii/submissions/
对于指定区间的链表反转和完全的链表反转,其区别点在于
- 首先定位到反转区间,只针对反转区间进行反转操作
- 将原始链表中不需要反转的区间和最终反转成功的反转链表进行连接合并(核心点就在于需要记录三个区间的位置)
对于具体的反转链表依然是使用双指针来实现具体的反转操作
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(head == null){ return head; } // 前置节点 ListNode prev = null; // 当前节点 ListNode current = head; // 1: 首先采用双指针定位到 反转链表开始位置 while(m > 1){ // 对于m 而言 "1" 代表第一个元素 prev = current; current = current.next; m--; n--; } // 2: 定义 链表反转后,对于反转列表区间 中 head节点的前置节点以及反转链表的尾节点 ListNode reverseHeadPrev = prev; ListNode reverseTail = current; // 3: 使用 prev 和 current节点开始往后遍历,执行反转操作 while(n > 0){ // 记录临时变量维护断开连接后的后续节点位置 ListNode temp = current.next; // 进行链表反转操作,将当前 current节点的next指针指向 其前置节点 prev current.next = prev; // 将prev 和 current节点向后移动一位 prev = current; current = temp; n--; } // 4: 当链表反转操作结束后prev指向 反转后链表的头节点, current指向原始链表 反转区间最大区间的位置+1 // 相当于此时最多存在三个分离的链表 // head链表 其尾节点为 reverseHeadPrev 指针执行位置 // 反转链表 头节点为 prev 指针指向位置 // (n,链表最大长度] 区间位置的链表 ,其头节点为 current指针指向位置 // 将三个链表进行连接到一起 if(reverseHeadPrev == null){ // 说明反转链表的开始区间从第一个节点位置开始,因此最后反转链表的头节点就作为整个链表的头节点 head = prev; }else{ // 说明当前反转链表开始区间并非从第一个节点位置开始,因此在从第一个节点位置到开始反转位置[0,m)作为反转链表的前驱节点(链表) reverseHeadPrev.next = prev; } // 连接尾节点, 使用反转链表的尾节点 reverseTail 连接 最后的链表 current reverseTail.next = current; return head; } }