Leetcode面试经典150题-92.反转链表II

解法都在代码里,不懂就留言或者私信

/**
 * 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.next == null || left == right) {
            return head;
        }
        /**我们要做的是:1断开前后的连接(记录left之前一个节点pre和right之后的节点next)  2. 反转需要的部分 3. pre连接新的头
        新的尾连接next(新的尾就是原来的头)*/
        int count = 1;
        ListNode pre = null;
        ListNode cur = head;
        
        while(count < left) {
            pre = cur;
            count ++;
            cur = cur.next;
        }
        ListNode curRangeFirst = cur;
        /**如果前面有节点,断开和前面节点的关联 */
        if(pre != null) {
            pre.next = null;
        }
        /**两个while的条件都是小于,因为小于再next一下才是真正的第left(right) 个节点 */
        while(count < right) {
            count ++;
            cur = cur.next;
        }
        ListNode curRangeLast = cur;
        /**断开和后面链表节点的关联 */
        ListNode next = cur.next;
        cur.next = null;
        reverse(curRangeFirst);
        if(pre != null) {
            pre.next = curRangeLast;
        }
        curRangeFirst.next = next;
        /**如果是1,涉及换头,换的头就是当前left~right区间的最后一个节点(curRangeLast) */
        return left == 1? curRangeLast : head;
    }

    public void reverse(ListNode head) {
        ListNode pre = null;
        ListNode next = null;
        ListNode cur = head;
        while(cur != null) {
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值