始めに
つい最近leetcodeを始めたものの、以下のような問題が出てきてListNodeってなんぞ?となって詰まったのでメモ。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { } };
ListNodeとは何か
ちょっと調べたところ、「単方向連結リスト」のことらしい。 具体的に書いておくと、データを格納する「要素」と「ポインタ」を組にした「セル」と呼ばれる単位で,データの順序を管理する連結リスト構造。コードでいうint valが要素でListNode *nextが次のListNodeオブジェクトへのポインタ。 ref:http://www.ced.is.utsunomiya-u.ac.jp/lecture/2022/prog/p2/kadai2/3_list_1.php
ListNode() : val(0), next(nullptr) {}
は、デフォルトコンストラクタ。valを0で初期化し、nextをnullptr(次のノードがないことを意味する)で初期化。
ListNode(int x) : val(x), next(nullptr) {}
は、引数として整数xを取るコンストラクタ。valをxで初期化し、nextをnullptrで初期化。
ListNode(int x, ListNode *next) : val(x), next(next) {}
は、引数として整数xとListNodeへのポインタnextを取るコンストラクタ。valをxで初期化し、nextを引数で与えられたnextで初期化。
操作方法
- ノードの追加 リストの終端に新しいノードを追加する
ListNode* newNode = new ListNode(5); // 値が5の新しいノードを作成 if (head == nullptr) { head = newNode; // リストが空の場合、headを新しいノードに設定 } else { ListNode* current = head; while (current->next != nullptr) { current = current->next; // リストの最後まで移動 } current->next = newNode; // 最後のノードのnextを新しいノードに設定 }
- ノードの削除 リストからノードを削除するには、削除するノードの前のノードのnextを、削除するノードの次の ノードに設定
ListNode* current = head; ListNode* previous = nullptr; //削除したいノードの前のノードを見つけたい while (current != nullptr && current->val != value) { // valueは削除したい値 previous = current; current = current->next; } if (current != nullptr) { // 削除するノードが見つかった場合 if (previous != nullptr) { previous->next = current->next; } else { head = current->next; // ヘッドを削除する場合 } delete current; // ノードのメモリを解放 }
問題(今後追記)
Add Two Numbers : https://leetcode.com/problems/add-two-numbers/?envType=list&envId=xi4ci4ig