反轉鍊錶 ii
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。
說明:1 ≤ m ≤ n ≤ 鍊錶長度。
示例:輸入: 1->2->3->4->5->null, m = 2, n = 4
輸出: 1->4->3->2->5->null
遞推法
/**
* definition for singly-linked list.
* public class listnode
* }*/class
solution
listnode last =
reversen
(head.next, n -1)
;//返回的是頭結點
head.next.next = head;
//分為三個部分,頭結點,n -1個節點,剩餘的部分,三者最後要連起來
//鏈結第乙個與 n - 1個節點
head.next = succ;
//區別就在於不再是null
//鏈結前n個節點與後面的節點
return last;
}public listnode reversebetween
(listnode head,
int m,
int n)
head.next =
reversebetween
(head.next, m -
1, n -1)
;//注意這個時候首先必然不是在head,因為m != 1
return head;
}}
2.迭代方法
自己錯誤方法,能夠通過30/40
主要是少考慮m ==1時,這個時候直接return head是有問題的,head已經發生了變化
[3,5]22
對於這樣的m=n,同時還在尾部,也是不成立的
class
solution
cnt++
; cur = cur.next;
} start = pre.next;
//m = 1,start也取不到正確的值
listnode next = cur.next;
//如果m=n且都在尾部,這個時候就會空指標異常
listnode n1, n2, n3;
n1 = null;
n2 = start;
n3 = null;
while
(n2 != next)
pre.next = end;
start.next = next;
return head;
}}
改進方法
class
solution
//原來是想一次確定該單元的前後連線點,這樣需要考慮的特殊情況就比較多
//還需要移動n次,不確定可以畫圖試試
listnode n1, n2, n3;
n1 = prev;
//n1 = null//一樣
n2 = cur;
n3 = null;
while
(n >0)
//腦子裡要明確迴圈結束時,n1,n2的位置
= n2;不能直接寫,prev有可能為null
if(prev == null)
else
cur.next = n2;
return head;
}}
92 反轉鍊錶 II
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4輸出 1 4 3 2 5 null definition for singly linked list.struct listnode class soluti...
92 反轉鍊錶 II
題目描述 反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null 方法1 主要思路 1 直觀的想,找出要反轉的一段的鍊錶的頭乙個結點的前乙個結點,使用頭插法,將該段鍊錶中的結點,...
92 反轉鍊錶 II
92.反轉鍊錶 ii 難度中等425收藏分享切換為英文關注反饋 反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4輸出 1 4 3 2 5 nullpublic static listnode reverseb...