每天一道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
思路
代码
/**
* 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;
}
}
代码讲解