赞
踩
可以参考 这题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; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。