0
0

More than 3 years have passed since last update.

アルゴリズム体操13

Posted at

Nth from the Last Node (Easy)

説明

Singly Linked Listの headノードと、整数nが渡されるので、
最後からn番目のノードを返すアルゴリズムを実装してみましょう(nが範囲外の場合はnullを返します)。

Solution

考え方は、nノード離れた2つのポインター使っていきます。
1つ目のポインタはheadを指し、二つ目はn番目のノードを指すように最初に設定します(初期設定)。
もし二つ目のノードが初期設定の際に、リストの最終地点であるnullに達した場合はnullを返します(out-of-bounds)。
次に、ループで2つ目のポインターが最終地点に到達するまで、両方のポインターを前方に移動させていきます。
ループ終了後は、最初のポインターは最後からn番目のノードを指すことになるので、そのポインタを返します。

Runtime Complexity O(n)

Singley Linked List に対して線形走査するので実行時間はO(n)となります。

Space Complexity O(1)

二つのポインタを使うのでメモリ効率はO(1)の定数となります。

3番目の最後のノード(n = 3)を検索する以下のリストの例を見てみましょう。
Screen Shot 2020-01-09 at 19.07.12.png
初期設定として、片方のポインタをnノード分移動させます。
Screen Shot 2020-01-09 at 19.08.10.png
先に進めてあるポインタが最終地点のnullに到達するまで両方のポインタを前に進めていきます。
Screen Shot 2020-01-09 at 19.12.02.png
Screen Shot 2020-01-09 at 19.12.22.png
Screen Shot 2020-01-09 at 19.12.49.png
これで、最後から3番目のnodeを見つけることができました。

実装

lastNthFromList.java
class lastNthFromList{
  public LinkedListNode FindNthFromLast(LinkedListNode head,int n) {

    if (head == null || n < 1) return null; // edge case

    LinkedListNode targetNode = head;
    LinkedListNode searchNode = head;

    while (searchNode != null && n != 0) {
      searchNode = searchNode.next;
      n--;
    }

    if (n != 0) return null; // check out-of-bounds

    while(searchNode != null) {
      targetNode = targetNode.next;
      searchNode = searchNode.next;
    }

    return targetNode;
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0