スローポインタのポインタをすばやくリストの最後に来るまで、ポインタがKステップ後の速い散歩に行くまでは、遅すぎるポインター:ちょうどポインタの速度を使用して、最後から二番目のK要素として見て横断後、Kの最後から二番目が達成することができますKは最後から二番目のいずれかに行ってきました。
これと同じ、同等のバイナリで徒歩でフルポインタ、二段階の二段階の迅速ポインタ、ポインタだけですぐにリストの最後に来るか、リストの末尾に次のヌル・ポインタに行く知っている、そして、終了条件が非常に重要です。
より一般的なアイデアは、彼らがコンテナのリストを作成したいです、直接リストの半分のサイズを返すために最後を添加しました。
public ListNode middleNode(ListNode head) {
if (head == null){
return null;
}
int count = 0;
ArrayList<ListNode> list = new ArrayList<>();
while (head != null){
list.add(head);
head = head.next;
count++;
}
//int index = count % 2 == 0 ? count / 2 + 1 : count / 2;
return list.get(count / 2);
}
public ListNode middleNode1(ListNode head) {
if (head == null){
return null;
}
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public void print(ListNode head){
while (head != null){
System.out.print(head.val + " ");
head = head.next;
}
}