问题描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
问题分析
这题我们需要找到一个结点,然后不断的将m到n之间的元素进行头插法,我们还需要记录一下第m个结点,因为我们待会儿还要让它指向第n个结点的下一个结点。
对了,我们一般来说都要给单链表安一个头,这样的话我们就可以对每个结点都用相同的算法了。
AC代码
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode cur = head;
head = new ListNode(-1);
head.next = cur;
ListNode last = head;
int count = n-m+1;
int i = 1;
for(;i < m; i++){
last = last.next;
cur = cur.next;
}
ListNode first = cur; // 记住第m个结点
ListNode curr = null;
for(int j = 0; j < count; j++){
curr = cur;
cur = cur.next;
curr.next = last.next;
last.next = curr;
}
first.next = cur;
return head.next;
}
}