0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

アルゴリズム体操14

Last updated at Posted at 2020-01-11

#Swap Nth Node with Head (Easy)

##説明
Singly Linked Listの head と 整数「N」が引数として渡されます。
head と head からN番目のノードと交換します。返り値は新しいLinked listのheadです。
##例
N = 4の例を見てみましょう。
Screen Shot 2020-01-10 at 16.35.08.png
head を一番目として4番目のノードの28とheadの7を交換するので以下の様になります。
Screen Shot 2020-01-10 at 16.35.25.png

##Solution
###Runtime Complexity O(n)
Linked List に対して走査する必要があるので最悪O(n)かかります。
###Space Complexity O(1)
複数のポインタのみを使用するので、メモリ効率はO(1)となります。

###Step By Step
二つのポインタを用意します。
Screen Shot 2020-01-10 at 16.42.22.png
currentのポインタがN番目のノードを指すまでループします。
Screen Shot 2020-01-10 at 16.43.15.png
currentのポインタが4番目のノードを指すので、ここでループを止めます。
Screen Shot 2020-01-10 at 16.45.12.png
ここからは、ノードの交換をしていきます。
Screen Shot 2020-01-10 at 16.46.28.png
Screen Shot 2020-01-10 at 16.47.12.png
Screen Shot 2020-01-10 at 16.47.32.png
Screen Shot 2020-01-10 at 16.47.50.png
ここで、Swapping できたので、currentのポインタを返します。

###実装

SwapNth.java
class SwapNth{
  // Node indices starts from 1.
  public LinkedListNode SwapNthNode(LinkedListNode head, int n) {

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

    LinkedListNode cur = head;
    LinkedListNode prev = null;

    int count = 1;

    while (count < n && cur != null) {
      prev = cur;
      cur = cur.next;
      count++;
    }

    if (cur == null) return head;

    // Swapping
    prev.next = head;
    LinkedListNode temp = head.next;
    head.next = cur.next;
    cur.next = temp;
    
    return cur;
  }
} 

###感想
Linked Listに対してSwapping や Sorting などの単純操作を適用したい場合は
複数のポインタを活用することで解決策が見えてくると思います。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?