diff --git a/chapter_array_and_linkedlist/linked_list.cpp b/chapter_array_and_linkedlist/linked_list.cpp index 3304ead..18b4f88 100644 --- a/chapter_array_and_linkedlist/linked_list.cpp +++ b/chapter_array_and_linkedlist/linked_list.cpp @@ -7,16 +7,18 @@ #include "../utils/common.hpp" /* 在链表的节点 n0 之后插入节点 P */ -void insert(ListNode *n0, ListNode *P) { - ListNode *n1 = n0->next; - P->next = n1; - n0->next = P; +void insert(ListNode *n0, ListNode *P) +{ + ListNode *n1 = n0->next; // n0 -> n1 + P->next = n1; // P -> n1 + n0->next = P; // n0 -> P } /* 删除链表的节点 n0 之后的首个节点 */ -void remove(ListNode *n0) { +void remove(ListNode *n0) +{ if (n0->next == nullptr) - return; + return; // n0 之后没有节点 // n0 -> P -> n1 ListNode *P = n0->next; ListNode *n1 = P->next; @@ -26,8 +28,10 @@ void remove(ListNode *n0) { } /* 访问链表中索引为 index 的节点 */ -ListNode *access(ListNode *head, int index) { - for (int i = 0; i < index; i++) { +ListNode *access(ListNode *head, int index) +{ + for (int i = 0; i < index; i++) + { if (head == nullptr) return nullptr; head = head->next; @@ -36,25 +40,28 @@ ListNode *access(ListNode *head, int index) { } /* 在链表中查找值为 target 的首个节点 */ -int find(ListNode *head, int target) { +int find(ListNode *head, int target) +{ int index = 0; - while (head != nullptr) { - if (head->val == target) - return index; - head = head->next; - index++; + while (head != nullptr) + { + if (head->val == target) // 找到节点 + return index; // 返回索引 + head = head->next; // 更新节点 + index++; // 更新索引 } - return -1; + return -1; // 未找到节点, 返回 -1 } /* Driver Code */ -int main() { +int main() +{ /* 初始化链表 */ // 初始化各个节点 - ListNode *n0 = new ListNode(1); + ListNode *n0 = new ListNode(1); // 创建一个节点, 值为1 ListNode *n1 = new ListNode(3); ListNode *n2 = new ListNode(2); - ListNode *n3 = new ListNode(5); + ListNode *n3 = new ListNode(5); // 创建一个节点, 值为5 ListNode *n4 = new ListNode(4); // 构建节点之间的引用 n0->next = n1; diff --git a/chapter_array_and_linkedlist/list.cpp b/chapter_array_and_linkedlist/list.cpp index e0502cc..90ca37a 100644 --- a/chapter_array_and_linkedlist/list.cpp +++ b/chapter_array_and_linkedlist/list.cpp @@ -7,65 +7,69 @@ #include "../utils/common.hpp" /* Driver Code */ -int main() { - /* 鍒濆鍖栧垪琛 */ +int main() +{ + /* 初始化列表 */ vector nums = {1, 3, 2, 5, 4}; - cout << "鍒楄〃 nums = "; + cout << "列表 nums = "; printVector(nums); - /* 璁块棶鍏冪礌 */ + /* 访问元素 */ int num = nums[1]; - cout << "璁块棶绱㈠紩 1 澶勭殑鍏冪礌锛屽緱鍒 num = " << num << endl; + cout << "访问索引 1 处的元素,得到 num = " << num << endl; - /* 鏇存柊鍏冪礌 */ + /* 更新元素 */ nums[1] = 0; - cout << "灏嗙储寮 1 澶勭殑鍏冪礌鏇存柊涓 0 锛屽緱鍒 nums = "; + cout << "将索引 1 处的元素更新为 0 ,得到 nums = "; printVector(nums); - /* 娓呯┖鍒楄〃 */ + /* 清空列表 */ nums.clear(); - cout << "娓呯┖鍒楄〃鍚 nums = "; + cout << "清空列表后 nums = "; printVector(nums); - /* 鍦ㄥ熬閮ㄦ坊鍔犲厓绱 */ + /* 在尾部添加元素 */ nums.push_back(1); nums.push_back(3); nums.push_back(2); nums.push_back(5); nums.push_back(4); - cout << "娣诲姞鍏冪礌鍚 nums = "; + cout << "添加元素后 nums = "; printVector(nums); - /* 鍦ㄤ腑闂存彃鍏ュ厓绱 */ + /* 在中间插入元素 */ nums.insert(nums.begin() + 3, 6); - cout << "鍦ㄧ储寮 3 澶勬彃鍏ユ暟瀛 6 锛屽緱鍒 nums = "; + cout << "在索引 3 处插入数字 6 ,得到 nums = "; printVector(nums); - /* 鍒犻櫎鍏冪礌 */ + /* 删除元素 */ nums.erase(nums.begin() + 3); - cout << "鍒犻櫎绱㈠紩 3 澶勭殑鍏冪礌锛屽緱鍒 nums = "; + cout << "删除索引 3 处的元素,得到 nums = "; printVector(nums); - /* 閫氳繃绱㈠紩閬嶅巻鍒楄〃 */ + /* 通过索引遍历列表 */ int count = 0; - for (int i = 0; i < nums.size(); i++) { + for (int i = 0; i < nums.size(); i++) + { count += nums[i]; } - /* 鐩存帴閬嶅巻鍒楄〃鍏冪礌 */ + /* 直接遍历列表元素 */ count = 0; - for (int x : nums) { + for (int x : nums) + { count += x; } - /* 鎷兼帴涓や釜鍒楄〃 */ + /* 拼接两个列表 */ vector nums1 = {6, 8, 7, 10, 9}; nums.insert(nums.end(), nums1.begin(), nums1.end()); - cout << "灏嗗垪琛 nums1 鎷兼帴鍒 nums 涔嬪悗锛屽緱鍒 nums = "; + cout << "将列表 nums1 拼接到 nums 之后,得到 nums = "; printVector(nums); - /* 鎺掑簭鍒楄〃 */ - sort(nums.begin(), nums.end()); - cout << "鎺掑簭鍒楄〃鍚 nums = "; + /* 排序列表 */ + // sort(nums.begin(), nums.end() ); // 默认升序 + sort(nums.begin(), nums.end(),less()); + cout << "排序列表后 nums = "; printVector(nums); return 0; diff --git a/chapter_array_and_linkedlist/my_list.cpp b/chapter_array_and_linkedlist/my_list.cpp index 4fff94b..042a1fb 100644 --- a/chapter_array_and_linkedlist/my_list.cpp +++ b/chapter_array_and_linkedlist/my_list.cpp @@ -6,111 +6,127 @@ #include "../utils/common.hpp" -/* 鍒楄〃绫 */ -class MyList { - private: - int *arr; // 鏁扮粍锛堝瓨鍌ㄥ垪琛ㄥ厓绱狅級 - int arrCapacity = 10; // 鍒楄〃瀹归噺 - int arrSize = 0; // 鍒楄〃闀垮害锛堝綋鍓嶅厓绱犳暟閲忥級 - int extendRatio = 2; // 姣忔鍒楄〃鎵╁鐨勫嶆暟 +/* 列表类 */ +class MyList +{ +private: + int *arr; // 数组(存储列表元素) + int arrCapacity = 10; // 列表容量 + int arrSize = 0; // 列表长度(当前元素数量) + int extendRatio = 2; // 每次列表扩容的倍数 - public: - /* 鏋勯犳柟娉 */ - MyList() { +public: + /* 构造方法 */ + MyList() + { arr = new int[arrCapacity]; } - /* 鏋愭瀯鏂规硶 */ - ~MyList() { + /* 析构方法 */ + ~MyList() + { delete[] arr; } - /* 鑾峰彇鍒楄〃闀垮害锛堝綋鍓嶅厓绱犳暟閲忥級*/ - int size() { + /* 获取列表长度(当前元素数量)*/ + int size() + { return arrSize; } - /* 鑾峰彇鍒楄〃瀹归噺 */ - int capacity() { + /* 获取列表容量 */ + int capacity() + { return arrCapacity; } - /* 璁块棶鍏冪礌 */ - int get(int index) { - // 绱㈠紩濡傛灉瓒婄晫锛屽垯鎶涘嚭寮傚父锛屼笅鍚 + /* 访问元素 */ + int get(int index) + { + // 索引如果越界,则抛出异常,下同 if (index < 0 || index >= size()) - throw out_of_range("绱㈠紩瓒婄晫"); + throw out_of_range("索引越界"); // out_of_range 是 C++ 标准库中的异常类 return arr[index]; } - /* 鏇存柊鍏冪礌 */ - void set(int index, int num) { + /* 更新元素 */ + void set(int index, int num) + { if (index < 0 || index >= size()) - throw out_of_range("绱㈠紩瓒婄晫"); + throw out_of_range("索引越界"); arr[index] = num; } - /* 鍦ㄥ熬閮ㄦ坊鍔犲厓绱 */ - void add(int num) { - // 鍏冪礌鏁伴噺瓒呭嚭瀹归噺鏃讹紝瑙﹀彂鎵╁鏈哄埗 + /* 在尾部添加元素 */ + void add(int num) + { + // 元素数量超出容量时,触发扩容机制 if (size() == capacity()) extendCapacity(); arr[size()] = num; - // 鏇存柊鍏冪礌鏁伴噺 + // 更新元素数量 arrSize++; } - /* 鍦ㄤ腑闂存彃鍏ュ厓绱 */ - void insert(int index, int num) { + /* 在中间插入元素 */ + void insert(int index, int num) + { if (index < 0 || index >= size()) - throw out_of_range("绱㈠紩瓒婄晫"); - // 鍏冪礌鏁伴噺瓒呭嚭瀹归噺鏃讹紝瑙﹀彂鎵╁鏈哄埗 + throw out_of_range("索引越界"); + // 元素数量超出容量时,触发扩容机制 if (size() == capacity()) extendCapacity(); - // 灏嗙储寮 index 浠ュ強涔嬪悗鐨勫厓绱犻兘鍚戝悗绉诲姩涓浣 - for (int j = size() - 1; j >= index; j--) { + // 将索引 index 以及之后的元素都向后移动一位 + for (int j = size() - 1; j >= index; j--) + { arr[j + 1] = arr[j]; } arr[index] = num; - // 鏇存柊鍏冪礌鏁伴噺 + // 更新元素数量 arrSize++; } - /* 鍒犻櫎鍏冪礌 */ - int remove(int index) { + /* 删除元素 */ + int remove(int index) + { if (index < 0 || index >= size()) - throw out_of_range("绱㈠紩瓒婄晫"); + throw out_of_range("索引越界"); int num = arr[index]; - // 灏嗙储寮 index 涔嬪悗鐨勫厓绱犻兘鍚戝墠绉诲姩涓浣 - for (int j = index; j < size() - 1; j++) { + // 将索引 index 之后的元素都向前移动一位 + for (int j = index; j < size() - 1; j++) + { arr[j] = arr[j + 1]; } - // 鏇存柊鍏冪礌鏁伴噺 + // 更新元素数量 arrSize--; - // 杩斿洖琚垹闄ょ殑鍏冪礌 - return num; + // 返回被删除的元素 + return num; // 返回被删除的元素(告知调用者删除的元素是什么) } - /* 鍒楄〃鎵╁ */ - void extendCapacity() { - // 鏂板缓涓涓暱搴︿负鍘熸暟缁 extendRatio 鍊嶇殑鏂版暟缁 - int newCapacity = capacity() * extendRatio; - int *tmp = arr; - arr = new int[newCapacity]; - // 灏嗗師鏁扮粍涓殑鎵鏈夊厓绱犲鍒跺埌鏂版暟缁 - for (int i = 0; i < size(); i++) { + /* 列表扩容 */ + void extendCapacity() + { + // 新建一个长度为原数组 extendRatio 倍的新数组 + int newCapacity = capacity() * extendRatio; // 将列表容量扩大 extendRatio 倍 + int *tmp = arr; // 保存原数组的引用 + arr = new int[newCapacity]; // 新建一个长度为 newCapacity 的数组 + // 将原数组中的所有元素复制到新数组 + for (int i = 0; i < size(); i++) + { arr[i] = tmp[i]; } - // 閲婃斁鍐呭瓨 - delete[] tmp; - arrCapacity = newCapacity; + // 释放内存 + delete[] tmp; // 释放原数组的内存 + arrCapacity = newCapacity; // 更新列表容量 } - /* 灏嗗垪琛ㄨ浆鎹负 Vector 鐢ㄤ簬鎵撳嵃 */ - vector toVector() { - // 浠呰浆鎹㈡湁鏁堥暱搴﹁寖鍥村唴鐨勫垪琛ㄥ厓绱 - vector vec(size()); - for (int i = 0; i < size(); i++) { + /* 将列表转换为 Vector 用于打印 */ + vector toVector() + { + // 仅转换有效长度范围内的列表元素 + vector vec(size()); // 创建一个长度为 size() 的 vector + for (int i = 0; i < size(); i++) + { vec[i] = arr[i]; } return vec; @@ -118,53 +134,55 @@ class MyList { }; /* Driver Code */ -int main() { - /* 鍒濆鍖栧垪琛 */ +int main() +{ + /* 初始化列表 */ MyList *nums = new MyList(); - /* 鍦ㄥ熬閮ㄦ坊鍔犲厓绱 */ + /* 在尾部添加元素 */ nums->add(1); nums->add(3); nums->add(2); nums->add(5); nums->add(4); - cout << "鍒楄〃 nums = "; + cout << "列表 nums = "; vector vec = nums->toVector(); printVector(vec); - cout << "瀹归噺 = " << nums->capacity() << " 锛岄暱搴 = " << nums->size() << endl; + cout << "容量 = " << nums->capacity() << " ,长度 = " << nums->size() << endl; - /* 鍦ㄤ腑闂存彃鍏ュ厓绱 */ + /* 在中间插入元素 */ nums->insert(3, 6); - cout << "鍦ㄧ储寮 3 澶勬彃鍏ユ暟瀛 6 锛屽緱鍒 nums = "; + cout << "在索引 3 处插入数字 6 ,得到 nums = "; vec = nums->toVector(); printVector(vec); - /* 鍒犻櫎鍏冪礌 */ + /* 删除元素 */ nums->remove(3); - cout << "鍒犻櫎绱㈠紩 3 澶勭殑鍏冪礌锛屽緱鍒 nums = "; + cout << "删除索引 3 处的元素,得到 nums = "; vec = nums->toVector(); printVector(vec); - /* 璁块棶鍏冪礌 */ + /* 访问元素 */ int num = nums->get(1); - cout << "璁块棶绱㈠紩 1 澶勭殑鍏冪礌锛屽緱鍒 num = " << num << endl; + cout << "访问索引 1 处的元素,得到 num = " << num << endl; - /* 鏇存柊鍏冪礌 */ + /* 更新元素 */ nums->set(1, 0); - cout << "灏嗙储寮 1 澶勭殑鍏冪礌鏇存柊涓 0 锛屽緱鍒 nums = "; + cout << "将索引 1 处的元素更新为 0 ,得到 nums = "; vec = nums->toVector(); printVector(vec); - /* 娴嬭瘯鎵╁鏈哄埗 */ - for (int i = 0; i < 10; i++) { - // 鍦 i = 5 鏃讹紝鍒楄〃闀垮害灏嗚秴鍑哄垪琛ㄥ閲忥紝姝ゆ椂瑙﹀彂鎵╁鏈哄埗 + /* 测试扩容机制 */ + for (int i = 0; i < 10; i++) + { + // 在 i = 5 时,列表长度将超出列表容量,此时触发扩容机制 nums->add(i); } - cout << "鎵╁鍚庣殑鍒楄〃 nums = "; + cout << "扩容后的列表 nums = "; vec = nums->toVector(); printVector(vec); - cout << "瀹归噺 = " << nums->capacity() << " 锛岄暱搴 = " << nums->size() << endl; + cout << "容量 = " << nums->capacity() << " ,长度 = " << nums->size() << endl; - // 閲婃斁鍐呭瓨 + // 释放内存 delete nums; return 0;