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

本文详细解析了LeetCode上的经典题目“反转m到n处的链表”,提供了清晰的代码实现和算法思路,适合对链表操作及算法优化感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰

前言

2018.11.10号打卡明天的题目:

题目

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

题目详述

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

题目详解

思路

  • 分两种情况讨论哈,一种是m等于1的,一种是m不等于1的

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

  • m不等于1的话,说明是反转的中间部分的这些节点,

代码

 1/**
 2 * Definition for singly-linked list.
 3 * public class ListNode {
 4 *     int val;
 5 *     ListNode next;
 6 *     ListNode(int x) { val = x; }
 7 * }
 8 */
 9class Solution {
10    public ListNode reverseBetween(ListNode head, int m, int n) {
11        if(head == null || head.next == null)
12            return head;
13        if(m != 1)
14        {
15            ListNode temp = head.next;
16            ListNode preFirst = head;//指向反转处的前一个节点值
17            for(int i=0;i<m-2;i++)
18            {
19                temp = temp.next;
20                preFirst = preFirst.next;
21            }
22            //从temp处开始反转链表;
23            //由于temp是反转后的最后一个节点记录temp这个节点
24            ListNode last = temp;
25            ListNode pre = temp;//在这里开始反转链表 老套路
26            ListNode pNode = temp.next;
27            ListNode next = null;
28            for(int i=0;i<n-m;i++)
29            {
30                next = pNode.next;
31                pNode.next = pre;
32                pre = pNode;
33                pNode = next;
34            }
35            preFirst.next = pre;
36            last.next = pNode;
37        }else{
38            ListNode pre = head;
39            ListNode pNode = head.next;
40            ListNode next = null;
41            ListNode last = pre;//记录下来这个last节点;
42            for(int i=0;i<n-m;i++)
43            {
44                next = pNode.next;
45                pNode.next = pre;
46                pre = pNode;
47                pNode = next;
48            }
49            last.next = pNode;//反转后的最后一个节点连接上后续的节点
50            return pre;//pre是反转后的头结点;
51        }
52        return head;
53    }
54}

代码讲解

  • 15-16行,一个temp是反转节点的开始的第一个,preFirst是temp节点的前一个节点,用来最后连接使用;

  • 17-21行 因为是从第m个节点开始,所以先去找到这个第m个节点;

  • 24-34行 就是反转链表了,不懂的看这篇文章,其中要注意的是,要把反转之前的第一个节点也就是m所在的节点保留下来,这样方便最后连接没反转的后一段部分的节点;

  • 35-36行 就是连接反转部分节点与前后两部分节点

  • 38-50行 就是反转前1-n个节点的代码,反转链表看之前的链接,然后需要注意的就是把第一个节点保留下来用来连接。

结束语

2018.11.10号打卡

作者乔戈里亲历2019秋招,哈工大计算机本硕,百度准入职java工程师,欢迎大家关注我的微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(准入职百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有每天一道leetcode打卡群与技术交流群,欢迎关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值