题目
分析
找到待翻转部分第一个节点的上个节点,然后利用头插法插入翻转部分节点。
public ListNode reverseBetween (ListNode head, int m, int n) {
// write code here
//定义一个头指针,统一操作,因为第一个翻转的节点可能就是头结点
ListNode head1 = new ListNode(-1);
head1.next = head;
int count = 1;
ListNode node = head1;
//找到第m个节点的前一个节点
while(node != null && count != m) {
count++;
node = node.next;
}
//第一个翻转节点
ListNode node1 = node.next;
node.next = null;
//要翻转部分的长度
count = n - m + 1;
//保存尾结点
ListNode last = node1;
//翻转链表
while(node1 != null && count > 0) {
ListNode temp = node1.next;
node1.next = node.next;
node.next = node1;
node1 = temp;
count--;
}
//连接未翻转部分
last.next = node1;
return head1.next;
}