前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一道leetcode92-反转m到n处的链表

每天一道leetcode92-反转m到n处的链表

作者头像
乔戈里
发布2019-09-17 14:52:21
1K0
发布2019-09-17 14:52:21
举报
文章被收录于专栏:Java那些事

题目

每天一道leetcode92-反转m到n处的链表 分类:链表 中文链接: https://leetcode-cn.com/problems/reverse-linked-list-ii/ 英文链接 https://leetcode.com/problems/reverse-linked-list-ii/

题目详述

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL

题目详解

思路

  • 分两种情况讨论哈,一种是m等于1的,一种是m不等于1的
  • m等于1的话,简单,就是一个反转链表,如何反转见这篇文章,之前写过;m等于1的话,先反转m-n这些节点,反转完成以后,一开始的头结点就成了最后一个节点,所以反转前把这个节点保留下来,然后反转结束以后把后面的连起来就行;
  • m不等于1的话,说明是反转的中间部分的这些节点,

代码

代码语言:javascript
复制
/**
 * 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 || head.next == null)
            return head;
        if(m != 1)
        {
            ListNode temp = head.next;
            ListNode preFirst = head;//指向反转处的前一个节点值
            for(int i=0;i<m-2;i++)
            {
                temp = temp.next;
                preFirst = preFirst.next;
            }
            //从temp处开始反转链表;
            //由于temp是反转后的最后一个节点记录temp这个节点
            ListNode last = temp;
            ListNode pre = temp;//在这里开始反转链表 老套路
            ListNode pNode = temp.next;
            ListNode next = null;
            for(int i=0;i<n-m;i++)
            {
                next = pNode.next;
                pNode.next = pre;
                pre = pNode;
                pNode = next;
            }
            preFirst.next = pre;
            last.next = pNode;
        }else{
            ListNode pre = head;
            ListNode pNode = head.next;
            ListNode next = null;
            ListNode last = pre;//记录下来这个last节点;
            for(int i=0;i<n-m;i++)
            {
                next = pNode.next;
                pNode.next = pre;
                pre = pNode;
                pNode = next;
            }
            last.next = pNode;//反转后的最后一个节点连接上后续的节点
            return pre;//pre是反转后的头结点;
        }
        return head;
    }
}

代码讲解

  • 15-16行,一个temp是反转节点的开始的第一个,preFirst是temp节点的前一个节点,用来最后连接使用;
  • 17-21行 因为是从第m个节点开始,所以先去找到这个第m个节点;
  • 24-34行 就是反转链表了,不懂的看这篇文章,其中要注意的是,要把反转之前的第一个节点也就是m所在的节点保留下来,这样方便最后连接没反转的后一段部分的节点;
  • 35-36行 就是连接反转部分节点与前后两部分节点
  • 38-50行 就是反转前1-n个节点的代码,反转链表看之前的链接,然后需要注意的就是把第一个节点保留下来用来连接。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 题目详述
  • 题目详解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档