リストの最後からn番目のノードのアルゴリズム削除

アルゴリズムは、リストの最後から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リストの先頭をマークするために使用されています

6868357-c6b0526cdf76379e.png
image.png

おすすめ

転載: blog.csdn.net/weixin_34357436/article/details/90973829