题解 | #链表内指定区间反转#

链表内指定区间反转

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

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    //本题思路:首先将这段区间内的链表反转,然后再连接即可
    //定义一个反转链表的函数
    public ListNode reverse(ListNode head){
        if(head==null||head.next==null){
            return head;
        }
        ListNode pre=null;
        ListNode next=null;
        while(head!=null){
            next=head.next;
            head.next=pre;
            pre=head;
            head=next;
        }
        return pre;     
    }
    public ListNode reverseBetween (ListNode head, int m, int n) {
        // write code here
        int index=1;//记录当前遍历到链表的哪个位置了
        ListNode pre=null;//用来记录这段区间的前一个节点
        ListNode rear=null;//用来记录这段区间的后一个节点
        ListNode start=null;//反转区间链表的头节点
        ListNode end=null;//反转区间链表的尾节点
        ListNode cur=head;
        while(cur!=null){
            if(index==m-1){
                pre=cur;    
            }
            if(index==m){
                start=cur;
            }
            if(index==n){
                end=cur;
                rear=cur.next;
                break;//遍历到第n个节点break
            }
            cur=cur.next;
            index++;
        }
        //找到这四个关键节点之后就能进行反转了
        //注意这里有个细节,如果m==1的话,此时是找不到pre节点的此时pre节点是不存在的,恰好pre初始值为null也满足这种特殊情况
        end.next=null;
        ListNode tmp=start;
        start=reverse(start);//反转链表
        if(pre!=null){
            pre.next=start;
        }
        System.out.println(tmp.val);
        tmp.next=rear;
        return pre==null?start:head;  
    }
}
全部评论
对Java的地址很迷啊,被函数传参搞蒙掉了。。
点赞 回复 分享
发布于 2022-05-28 20:49

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
object3:开始给部分🌸孝子上人生第一课了
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务