算法-链表:链表的常见六个操作
设计一个链表,实现六个接口:
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