考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰”
前言
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打卡群与技术交流群,欢迎关注。