C++で単方向リンクリストの先頭にノードを挿入するプログラムの書き方
リンクリスト(連結リスト)とは、複数のノードが互いに接続された線形データ構造です。各ノードは「データフィールド」と「次のノードへのアドレス」という2つのフィールドで構成されています。
ここでは、与えられた単方向リンクリストの先頭(ヘッド)に新しいノードを挿入する方法を解説します。
入力例 − 1 → 2 → 3 → 4
このリンクリストの先頭に「5」を挿入します。
出力 − 5 → 1 → 2 → 3 → 4
説明 − 先頭にノードを挿入した後、リンクリストは 5 → 1 → 2 → 3 → 4 と表示されます。
問題を解くためのアプローチ
最初に、複数のノードから構成されるリンクリストが与えられています。各ノードにはデータと次のノードへのアドレスが格納されています。
すでにノードが用意されているため、ヘッドノードのアドレスと挿入するデータを引数として受け取り、リンクリストの先頭にデータを挿入する関数を作成します。挿入後は、ヘッドポインタを新しく挿入したノードに向けるのがポイントです。
関数 insertAthead(node*&head, int data) は、ヘッドノードのアドレス(参照渡し)と挿入するデータを受け取ります。
新しいノードを作成し、そこにデータを格納します。
新しいノードのnextポインタを現在のヘッドに設定し、ヘッドを新しいノードに更新します。
リンクリストを出力して結果を確認します。
コード例
#include<iostream>
using namespace std;
class node{
public:
int data;
node* next;
node(int d){
data = d;
next = NULL;
}
};
void insertAthead(node*&head, int data){
node* n = new node(data);
n->next = head;
head = n;
}
void print(node* head){
while(head != NULL){
cout<<head->data<<"->";
head = head->next;
}
}
int main(){
node* head = NULL;
insertAthead(head, 5);
insertAthead(head, 2);
insertAthead(head, 8);
insertAthead(head, 3);
print(head);
}出力
上記のコードを実行すると、次の出力が得られます。
3→ 8→ 2→ 5 →
リンクリストの先頭にノード 3、8、2、5 を順番に挿入すると、出力は 3→ 8→ 2→ 5 → となります。先頭への挿入では最後に挿入したノードが常に先頭に来るため、挿入した順序と逆の順序で表示される点に注意してください。計算量は挿入1回あたりO(1)と非常に効率的です。
-
Pythonで単方向リンクリストを循環リンクリストに変換する方法
単方向リンクリスト(片方向連結リスト)を循環リンクリストへ変換する必要がある場合、convert_to_circular_list というメソッドを定義します。このメソッドは、リストの最後のノードが先頭のノードを指すようにすることで、リスト全体を循環構造にします。以下に具体的な実装例を示します。サンプルコードclass Node: def __init__(self, data): self.data = data self.next = None class LinkedList_struct: def __init__(self):
-
【Python】双方向リンクリストの先頭に新しいノードを挿入するプログラム
双方向リンクリスト(Doubly Linked List)の先頭に新しいノードを挿入するには、まず「Node」クラスを作成する必要があります。このクラスには、ノードが保持するデータ、リンクリスト上の次のノードへの参照、前のノードへの参照という3つの属性を定義します。 以下に具体的な実装例を示します。 サンプルコード class Node: def __init__(self, my_data): self.prev = None # 前のノードへの参照 self.data = my_data # ノードが保持するデータ se