题解 | 链表内指定区间反转 特殊情况很多,边界值麻烦,虚拟头节点,过程繁琐。

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param m int整型
     * @param n int整型
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        // write code here

        //特殊情况
        if (m == n) return head;

        //虚拟头节点,用来应对边界情况
        ListNode myNode = new ListNode(-1);
        myNode.next = head;
        

        
        ListNode left = null;
        ListNode right = null;

        ListNode left_last = null;

        //寻找区间链表
        int i = 0;
        ListNode temp = myNode;
        while (temp != null) {
            if (i == m-1) {
                left_last = temp;
            }
            if (i == n) {
                right = temp;
                break;
            }
            temp = temp.next;
            i++;
        }

        //备份头尾节点
        ListNode right_next = right.next;
        left = left_last.next;

        //切断联系
        right.next=null;
        left_last.next=null;

        //反转链表
        ListNode last = null;
        ListNode cur =  left;
        while (cur!=null) {

            temp = cur.next;
            cur.next = last;
            last = cur;
            cur = temp;
        }
        
        //接回链表:

        left.next = right_next;
        left_last.next = right;


        return myNode.next;
    }
}







全部评论

相关推荐

不愿透露姓名的神秘牛友
07-18 12:01
点赞 评论 收藏
分享
积极的小学生不要香菜:你才沟通多少,没500不要说难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务