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

链表内指定区间反转

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

  • 1、针对只有一个节点时,或者反转区间差为0时,直接信任传入链表头节点(不对头节点判空),返回头节点

  • 2、针对只有两个节点时,反转区间开始位置必定为1,且反转后,表尾成为新的表头,故需要将表头指向原表尾,返回新表头

  • 3、针对多节点,反转区间差大于等于1的,首先遍历寻找到区间开始节点,保存开始节点前一个节点,用于指向反转后区间的开始节点,另外需要保存开始遍历的节点,用于反转完成后的重新连接链表后续节点,即start = cur,然后开始遍历区间,开始进行反转,反转期间,需要保存一个临时节点tnx,表示当前节点下一节点,然后将当前节点指向前一节点pre(初始为null),再将pre指向当前节点cur,最后,将当前节点指向下一节点tnx,区间索引加1,在区间结束后,重新连接区间原开始反转节点的后续节点(第一次反转时,开始节点的后续节点被置空了),此时遍历完成后当前节点为区间外后续第一个节点,即start.next = cur;

  • 4、思路:

    4.1反转

    4.2重新连接 alt

  • 5、实现

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 reverseBetween (ListNode head, int m, int n) {
        // write code here
        if(head.next == null || m == n){
            return head;
        }
        int tm = 1;
        ListNode cur = head;
        ListNode ppre = null;
        while(tm < m){
            ppre = cur;
            cur = cur.next;
            tm++;
        }
        ListNode start = cur;
        ListNode pre = null;
        while(tm <= n){
            ListNode tnx = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tnx;
            tm++;
        }
        if(ppre != null){
            ppre.next = pre;
        }
        if(m == 1){
            head = pre;
        }
        if(cur != null){
            start.next = cur;
        }
        return head;
        
    }
}
``
全部评论

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务