原题链接:https://leetcode.com/problems/reverse-linked-list-ii/
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
反转链表的题一般有两种解法,图解见http://www.2cto.com/kf/201110/106607.html
使用第二种方法的java代码:
package leetcode;
public class ReverseLinkedListII {
//https://leetcode.com/problems/reverse-linked-list-ii/
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode root = new ListNode(0);
ListNode p = root;
root.next = head;
for (int i = 1; i < m && p != null; i++) {
p = p.next;
}
if (p != null) {
ListNode q = p.next;
ListNode r;
int changeNumber = n - m + 1; // 交换节点的数目
for (int i = 1; i < changeNumber && q.next != null; i++) {
r = q.next;
q.next = r.next;
r.next = p.next;
p.next = r; //p的next永远是遍历到的最后一个
}
head = root.next;
}
return head;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}