每天一道leetcode92-反转m到n处的链表
- 2019 年 10 月 4 日
- 筆記
题目
每天一道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的话,说明是反转的中间部分的这些节点,
代码
/** * 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个节点的代码,反转链表看之前的链接,然后需要注意的就是把第一个节点保留下来用来连接。