题目地址:https://leetcode.com/problems/reverse-linked-list-ii/description/
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.
就三步:截取,旋转,拼接:
public class ReverseLinkedListII {
public static ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null)
return head;
if (m == n)
return head;
ListNode p = head;
ListNode q = head;
for (int i = 1; i < n; i++)
q = q.next;
// Get the tail of the list
ListNode k = null;
if (q != null)
k = q.next;
// cut the tail of the list
q.next = null;
if (m == 1) {
head = reverseWholeLinkedList(p);
ListNode t = head;
while (t.next != null) {
t = t.next;
}
t.next = k;
} else {
for (int i = 1; i < m - 1; i++) {
p = p.next;
}
ListNode t = p;
p = p.next;
// link the reversed list
t.next = reverseWholeLinkedList(p);
while (t.next != null) {
t = t.next;
}
t.next = k;
}
return head;
}
public static ListNode reverseWholeLinkedList(ListNode list) {
if (list == null)
return list;
if (list.next == null)
return list;
ListNode p = list;
p = p.next;
ListNode q = list;
q.next = null;
while (p != null) {
ListNode k = p.next;
p.next = q;
q = p;
p = k;
}
return q;
}
public static void printLinkedList(ListNode list) {
if (list == null)
return;
ListNode node = list;
while (node != null) {
System.out.print(node.val + "->");
node = node.next;
}
System.out.println("null");
}
public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
printLinkedList(reverseBetween(head, 1, 5));
}
}