leetcode题解-92. Reverse Linked List II

题意:把链表中m到n的部分反转(1<=m<=n<=length)。
注意要求:在原地反转,也就是不能申请额外的空间,且只能遍历一遍。

例子:
链表 1->2->3->4->5->NULL, m = 2 and n = 4,
返回 1->4->3->2->5->NULL.

解析:
参考最高票的discuss,我们模拟一下逆置的过程:
1-2-3-4-5
先把3放2前面变成
1-3-2-4-5
再把4放3-2前面变成
1-4-3-2-5
循环该怎么做?

首先定义四个指针dummy,pre,start,then。
dummy为head的前置节点,只要题目可能涉及到头节点的变动,都需要声明dummy哑变量,最后返回dummy.next。
pre为一个不变的节点,用来标识在上述逆置过程中m的前置节点,在本题中为1。
start和then为用来逆置的节点,具体作用下面过程会有分析。

第一步,找到m的前置节点pre,然后start是pre的后继,then又是start的后继。在本题中pre为1节点,start为2节点,then为3节点。
第二部,利用pre,start,then这三个指针,从m+1到n的节点,依次放置到pre的后面。pre是永远不动的,因为插入的节点都需要插入它的后面,而start和then每次需要向后移动。即:

start.next = then.next;
then.next = pre.next;
pre.next = then;
then = start.next;

那么本题的代码也就很容易写出来了:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   public ListNode reverseBetween(ListNode head, int m, int n) {
        if(head == null) return null;
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode start = head;
        ListNode then = head.next;


        for(int i = 0; i < m - 1; i++){
            pre = pre.next;
            start = start.next;
            then = then.next;
        }

        for(int i = 0; i < n - m; i++){
            start.next = then.next;
            then.next = pre.next;
            pre.next = then;
            then = start.next;
        }
        return dummy.next;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值