可以参考 这题LeetCode - 25. K 个一组翻转链表,因为我们第一种解放就与这题相同。
找到 链表 left ~ right 这个范围,将它“截取出来”,单独进行反转,反转完后,将之接回链表中,为了能够将其接回链表中,我们需要获取 left 的前驱节点,和 right 的后驱节点。(LeetCode - 25. K 个一组翻转链表)
 
/** * 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) {
if(head == null || right == left){
return head;// 头节点为null,链表为空,反转链表没有意义(没有节点给你反转)
// right == left ,反转一个节点,等于没反转。也没有反转的意义
// 直接返回 head
}
ListNode newHead = new ListNode(0,head);
ListNode prev = newHead;
for(int i = 0; i < left - 1; i++){
prev = prev.next;
if(prev == null){// 防止空指针异常,另外防止 left 位置不合法(链表节点没有那么多)
return head;
}
}
ListNode rightNode = prev.next;
for(int i = 0;i < right - left;i++){
rightNode = rightNode.next;
if(rightNode == null){//防止空指针异常,另外防止 right 位置不合法(链表节点没有那么多)
return head;
}
}
ListNode rightNodeNext = rightNode.next;
ListNode[] reverse = myReverse(prev.next,rightNode);
prev.next = reverse[0];
rightNode = reverse[1];
rightNode.next = rightNodeNext;
return newHead.next;
}
public static ListNode[] myReverse(ListNode left,ListNode right){
ListNode prev = right.next;
ListNode p = left;
while( prev != right){
ListNode pNext = p.next;
p.next = prev;
prev = p;
p = pNext;
}
return new ListNode[]{right,left};
}
}
前面 跟解法一差不多(求 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) {
if(head == null || right == left){
return head;// 头节点为null,链表为空,反转链表没有意义(没有节点给你反转)
// right == left ,反转一个节点,等于没反转。也没有反转的意义
// 直接返回 head
}
ListNode newHead = new ListNode(0,head);
ListNode prev = newHead;
for(int i = 0; i < left - 1; i++){
prev = prev.next;
if(prev == null){// 防止空指针异常,另外防止 left 位置不合法(链表节点没有那么多)
return head;
}
}
ListNode cur = prev.next;
ListNode next = null;
for(int i = 0;i < right -left;i++){
next = cur.next;
cur.next = next.next;
next.next = prev.next;
prev.next = next;
}
return newHead.next;
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/DarkAndGrey/article/details/122146216
内容来源于网络,如有侵权,请联系作者删除!