アルゴリズムは、リストの最後からN番目のノードを削除します
説明
リンクリストを考えると、リストの最後からn番目のノードを削除し、その頭を返します。
例:
与えられたリンクされたリスト:1-> 2-> 3-> 4-> 5、およびn = 2。
最後から2番目のノードを除去した後、リンクされたリストは、1-> 2-> 3-> 5となります。
提出
package com.cctoken.algorithm;
/**
* @author chenchao
*/
public class RemoveNthNode {
public static void main(String[] args) {
ListNode head = new ListNode(1);
ListNode res = new RemoveNthNode().removeNthFromEnd(head, 1);
if (res != null) {
}
}
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null) {
return null;
}
ListNode start = new ListNode(0);
ListNode fast = start;
ListNode slow = start;
slow.next = head;
for (int i = 0; i < n; ++i) {
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return start.next;
}
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
}
溶液
除去された最後から二番目のN個のノードのリスト。特性のリストは、各ノードの特定の場所を知るために、完全なリストを横断するように決定されなければなりません。
最初のアイデアは、彼は、限り、このノードを除去することができるよう最後から二番目のN個のノードを知っていたスタック、スタックにトラバースするとき、この質問を取得することです。しかし、検討のこのプロセス
スペースは確かに非常に高くなりますので、直接横断時にアイデアは、メモリを削除しないの目的を達成することができます
ポインタの速度を使用して、両者の間のギャップは、ときに高速、常にNですポインタは、それを削除遅くする次のノードへのポインタ、次に、単に遅いポインタの最後から二番目のN + 1の場合に、リストの最後に到達したとき。
次いで、最終的な結果はstart.nextする、start.nextリストの先頭をマークするために使用されています