设计一个链表,实现六个接口:
1、获取链表的第index个节点的数值。
2、在链表的最前面插入一个节点。
3、在链表的最后面插入一个节点。
4、在链表的第index个节点前面插入一个节点。
5、删除链表的第index个元素。
6、打印当前链表。
注意:index从0开始,第0个节点就是头节点。
在对链表进行插入和删除操作时,重点是找到前一个节点。
#include <iostream> using namespace std; class MyFirstList{ public: struct LinkedNode{ int val; LinkedNode *next; LinkedNode(int x):val(x),next(nullptr){}; }; //初始化链表 MyFirstList(){ _dummyHead = new LinkedNode(0);//定义一个虚拟头节点 _size = 0;//链表长度 } //1、获取链表的第index个节点的数值。 int getIndexVal(int index){ if(index > (_size-1) || index < 0){//index从0开始 return -1; } LinkedNode *cur = _dummyHead->next;//从头节点开始遍历 while (index--) { cur = cur->next; } return cur->val; } //2、在链表的最前面插入一个节点。 void addNodeHead(int val){ LinkedNode *head = new LinkedNode(val); head->next = _dummyHead->next; _dummyHead->next = head; _size++; } //3、在链表的最后面插入一个节点。 void addNodeEnd(int val){ LinkedNode *end = new LinkedNode(val); LinkedNode *cur = _dummyHead; while(cur->next!=NULL){ cur = cur->next; } //当前cur为最后一个节点 cur->next = end; _size++; } //4、在链表的第index个节点前面插入一个节点。 void addNodeIndex(int index,int val){ if(index > _size || index < 0){ //可以在第size个节点上插入,相当于在最后面插入一个节点 return; } LinkedNode *newNode = new LinkedNode(val); //需要找到第index-1个节点 LinkedNode *cur = _dummyHead;//从虚拟头节点开始遍历 while(index--){ cur = cur->next; } //当前cur为第index-1个节点 newNode->next = cur->next; cur->next = newNode; _size++; } //5、删除链表的第index个元素。 void delNodeIndex(int index){ if(index >= _size || index < 0){//不能删除第size个元素,因为不存在第size个 return; } //需要找到第index-1个节点 LinkedNode *cur = _dummyHead;//从虚拟头节点开始遍历 while(index--){ cur = cur->next; } //当前cur为第index-1个节点 LinkedNode *tmp = cur->next; cur->next = cur->next->next; delete tmp;//手动释放内存 _size--; } //6、打印当前链表。 void printfList(){ cout<<"当前链表为:"; LinkedNode *cur = _dummyHead;//从头节点开始遍历 while (cur->next!=nullptr) { cout<< cur->next->val<<" "; cur = cur->next; } cout<<endl; } int getSize(){ return _size; } private: LinkedNode *_dummyHead; int _size; }; int main(){ MyFirstList *myFirstList = new MyFirstList(); cout<<"初始化链表完成,当前链表长度为:"<<myFirstList->getSize()<<endl; myFirstList->addNodeHead(4); myFirstList->addNodeHead(3); myFirstList->addNodeEnd(7); myFirstList->addNodeEnd(8); myFirstList->printfList(); cout<<"第三个元素为:"<<myFirstList->getIndexVal(3)<<endl; myFirstList->addNodeIndex(3,90); myFirstList->addNodeIndex(4,91); myFirstList->printfList(); myFirstList->delNodeIndex(5); myFirstList->printfList(); return 0; }
输出为:
初始化链表完成,当前链表长度为:0 当前链表为:3 4 7 8 第三个元素为:8 当前链表为:3 4 7 90 91 8 当前链表为:3 4 7 90 91 Program ended with exit code: 0