一、题目描述
翻转链表中第m个节点到第n个节点的部分
注意事项
m,n满足1 ≤ m ≤ n ≤ 链表长度
给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null
二、代码实现
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param ListNode head is the head of the linked list
* @oaram m and n
* @return: The head of the reversed ListNode
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
if (m >= n || head == null) {
return head;
}
//记录下头结点,保存为dummy
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
//找到第m-1结点
for (int i = 1; i < m; i++) {
if (head == null) {
return null;
}
head = head.next; //第m-1结点head
}
ListNode premNode = head; //第m-1结点permNode(head)
ListNode mNode = head.next; //第m个结点mNode
ListNode nNode = mNode, p = mNode.next; //当前结点p,前驱结点nNode
for (int i = m; i < n; i++) {
if (p == null) {
return null;
}
//翻转m--->n结点
ListNode temp = p.next; //当前结点的下一个结点位temp
p.next = nNode; //链表箭头翻转
nNode = p; //将nNode指针后移一位
p = temp; //将p指针后一位
}
mNode.next = p; //将第m个结点的下一个结点设置为第n+1个结点
premNode.next = nNode; //将第m-1结点permNode的下一个结点设置为第n个结点
return dummy.next;
}
}