算法-链表:链表的常见六个操作

算法-链表:链表的常见六个操作

设计一个链表,实现六个接口:
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!=nullptr){
            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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值