C++单向链表的学习

    科技2023-09-25  81

    单向链表

    单向链表的创建

    #pragma once #include<initializer_list> #include<iostream> #ifndef _LISTNODE_H struct ListNode { int value; ListNode* next;///这里的成员是一个next指针,代表指向下一个节点 ListNode() :value(0), next(nullptr) {} ListNode(int x) :value(x), next(nullptr) {} ListNode(int x, ListNode* next1) :value(x), next(next1) {} /*~ListNode() { releaseListNode(this); }*/ public: void printList(const ListNode* out); void releaseListNode(ListNode* l); void free(ListNode* node); }; void ListNode::releaseListNode(ListNode* node) { ListNode* temp; for (auto start = node; start != nullptr; start = start->next) { temp = start->next; } } void ListNode::free(ListNode* node) { delete node->next; } ListNode initList(const std::initializer_list<int>& init); ///<借助initializer_list<int>& init模板对ListNode进行初始化 ListNode initList(const std::initializer_list<int>& init) { ListNode *result = nullptr; ListNode** node = &result;///<这里的node之所以是一个双指针,是因为next的一个一维指针,需要借助node这个二维指针指向每个节点的next指针 for (auto iter = init.begin(); iter != init.end(); ++iter) { *node = new ListNode(*iter); node = &((*node)->next); } return *result; } ///<对ListNode中的数据进行打印 void ListNode::printList(const ListNode* out) { for (auto start = out; start!= nullptr; start = start->next) std::cout << start->value<<" "; std::cout << std::endl; } ListNode addTwoNumber(ListNode* l1, ListNode* l2); ///<在这里将两个ListNod中的内容按照一定的规律进行相加 ListNode addTwoNumber(ListNode* l1, ListNode* l2) { int sum = 0; ListNode* l3 = nullptr; ListNode** node = &l3; while (l1 != nullptr || l2 != nullptr || sum > 0) { if (l1 != nullptr) { sum += l1->value; l1 = l1->next; } if (l2 != nullptr) { sum += l2->value; l2 = l2->next; } *node = new ListNode(sum % 10); sum /= 10; node = &((*node)->next); } return *l3; } #endif // !_LISTNODE_H #include<cstdlib> #include"ListNode.h" #include<iostream> int main() { std::cout << "Hello World" << std::endl; ListNode l1; ListNode l2; ///<借助函数initList函数对ListNode进行初始化 l1 = initList({ 2,4,3 }); l2 = initList({ 5,6,4 }); ListNode result; result=addTwoNumber(&l1,&l2); ///<对每个链表的内容进行打印 l1.printList(&l1); l1.printList(&l2); l1.printList(&result); system("pause"); }

    测试结果

    Processed: 0.018, SQL: 8