新らしくなった基本情報 科目 B 20問バージョン アルゴリズムとプログラミング サンプル問題10をJavaにしてみました

2023 年 4 月からIPA (独立行政法人情報処理推進機構)の基本情報技術者試験の制度が変更されました。

ここでは、「基本情報技術者試験 科目 B のサンプル問題20問バージョン」の中から、アルゴリズムとプログラミングの問題を取り上げ、Javaのソースコードを示します。

【Javaプログラム】

class LinkedList {

	ListElement listHead;

	// 本問で問われている手続き
	public void delNode(int pos) {
		if (pos == 1) {
			listHead = listHead.next;
		} else {
			ListElement prev = listHead;
			for (int i = 2; i < pos; i++) { // iを2からposまで回す
				prev = prev.next;
			}
			if (prev.next != null) {
				prev.next = prev.next.next;
			}
		}
	}

	// 要素の追加メソッド
	public void append(char qVal) {
		ListElement curr, prev;
		curr = new ListElement(qVal);

		if (listHead == null) {
			listHead = curr;
		} else {
			prev = listHead;
			while (prev.next != null) {
				prev = prev.next;
			}
			prev.next = curr;
		}
	}

	// 画面表示のためのメソッド
	public void printList(LinkedList list) {
		ListElement currNode = list.listHead;
		System.out.print("LinkedList: ");
		while (currNode != null) {
			System.out.print(currNode.val + " ");
			currNode = currNode.next;
		}
	}
}

//ListElement型のクラス定義
class ListElement {

	char val;
	ListElement next;

	ListElement(char qVal) {
		val = qVal;
		next = null;
	}
}

//以下はテストクラス
public class Q10 {
	public static void main(String[] args) {
		LinkedList list = new LinkedList();
		list.append('s');
		list.append('a');
		list.append('y');
		list.append('c');
		list.append('o');
		list.append('n');

		list.printList(list); // 削除前のリストを表示
		System.out.println();

		list.delNode(2); // aを削除
		list.printList(list); // 削除後のリストを表示
	}
}

【結果】

LinkedList: s a y c o n
LinkedList: s y c o n

【プログラムの解説】

このプログラムは、単方向連結リストを実装し、リストから指定した位置のノードを削除する手続き delNode() を実行するものです。

LinkedList クラス: このクラスは連結リストの操作を管理します。重要な部分を以下に示します。

  • listHead フィールド: リストの先頭要素を示します。
  • delNode(int pos) メソッド: リストの pos 番目の要素を削除します。先頭の要素を削除する場合は listHead を次の要素に更新します。
  • append(char qVal) メソッド: 文字 qVal をリストの末尾に追加します。
  • printList(LinkedList list) メソッド: リストの全要素を表示します。

ListElement クラス: リストの各要素(ノード)を表すクラスです。

  • val フィールド: 要素の値を保持するための char 型の変数です。
  • next フィールド: 次のノードへのリンクを示すための変数です。

Q10 クラス: このクラスでは、LinkedList クラスを使って実際にリストの操作を行います。

  1. 新しい空のリストを作成します。
  2. 文字 's', 'a', 'y', 'c', 'o', 'n' を順番にリストに追加します。
  3. リストの要素を表示します。
  4. delNode(2) を実行して、リストの2番目の要素 'a' を削除します。
  5. リストの要素を再度表示します。

delNode() メソッドは、削除する要素がリストの先頭にあるかどうかで処理を変えています。先頭の要素を削除する場合、listHeadを次の要素に更新するだけで済みます。それ以外の場合は、削除したい要素の一つ前の要素を特定し、その次の次の要素を指すようにリンクを更新します。これにより、指定された要素をリストから取り除くことができます。