件名の説明:
位置Nの反転に連結された位置Mとの間の間隔は、インプレースアルゴリズム、及び一つのスキャンの完全な逆転の使用を必要とします。
例えば:
リストが指定されている1-> 2-> 3-> 4-> 5-> NULL、M = 2、N = 4、
バック1-> 4-> 3-> 2-> 5-> NULL。
注意:
所与M、N、以下の条件を満たす。
1≤M≤N≤鎖長
問題解決のアイデア:
図1に示すように、リストは、3つの部分、前M、MN、N-後に分割されてもよいです。
図2に示すように、MNはこの部分を反転します。
図3に示すように、三つの部分が互いに接続されています。
難易度が第二段階で、どのように逆転するには?
、3つのポインタを必要とします
現在のノードにP点、予め現在のノードがノードである前に、次の現在のノードが次を表します。
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null || head.next == null)
return head;
ListNode q = null;
ListNode p = head;
//q指向第m-1个node,即第一部分的end,p指向第m个位置,即第二部分的end
for(int i =0 ; i < m-1 ; i++){
q = p;
p = p.next;
}
ListNode end1 = q;
ListNode end2 = p;
ListNode pPre = p;
p = p.next;
ListNode pNext = null;
//第m到第n个反转
for(int i = m ; i < n ; i++){
pNext = p.next;
p.next = pPre;
pPre = p;
p = pNext;
}
ListNode start2 = pPre;
ListNode start3 = p;
end2.next = start3;
if(end1 != null)
end1.next = start2;
else
head = start2;
return head;
}