【20220929】【每日一题】设计链表

题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

1.首先得先会链表节点结构体的创建

    // 定义链表节点结构体
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr){}
    };

其中的最后一行为初始化属性,详细可见C++核心编程-类和对象-初始化列表,

语法为: 构造函数():属性1(值1),属性2(值2)...{}

2.关于返回第n个节点的值

虚拟节点法去返回,这样能统一方法

定义一个cur指针指向真正的头节点去遍历(n--)

3.在第一个节点前加一个节点

new一个新的节点newNode,相当于在虚拟头节点与真实头节点之间添加了一个newNode节点。

4.在最后一个节点后添加一个节点

new一个新的节点newNode,判断当前指针的指向是否为空,不为空则current往后走。注意这里的cur应该从虚拟头节点开始,因为首先得判断是否为空链表,如果从头节点开始则默认不为空链表。

5.在第n个节点前添加一个节点

注意n的取值:n可以取的值有小于0一直到等于m_size,只有大于m_size的情况不会插入节点。

n<0时,可以把n置为0;因为作用当n=0时也为在头部插入节点。cur从虚拟头节点开始

6.删除第n个节点

n符合条件,用n做遍历,其中current从虚拟头节点开始,因为删除处理的总是cur->next这个节点!!另外注意delete释放掉不需要的节点!!        

总结:只有返回第n个节点的值时,cur才从真实头节点开始,这是因为在返回时,while(n--)当n为0时,直接返回头节点的值,即为cur->val。

class MyLinkedList {
public:
    //定义链表节点结构体
    struct LinkedNode{
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val),next(nullptr){}//初始化属性,在C++核心编程-类和对象里有提到
    };
    //初始化链表
    MyLinkedList() {
        _dummyhead=new LinkedNode(0);
        m_size=0;
    }
    
    int get(int index) {
        if(index<0||index>m_size-1)
            return -1;
        LinkedNode* cur=_dummyhead->next;
        while(index--){
            cur=cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        LinkedNode* newNode=new LinkedNode(val);
        newNode->next=_dummyhead->next;
        _dummyhead->next=newNode;
        m_size++;
    }
    
    void addAtTail(int val) {
        LinkedNode* newNode=new LinkedNode(val);
        LinkedNode*cur=_dummyhead;
        while(cur->next!=nullptr){
            cur=cur->next;
        }
        cur->next=newNode;
        m_size++;
    }
    
    void addAtIndex(int index, int val) {
        LinkedNode* newNode=new LinkedNode(val);
        LinkedNode* cur=_dummyhead;
        if(index<0){
            index=0;
        }
        else if(index<=m_size&&index>=0){
            while(index--){
                cur=cur->next;
            }
            newNode->next=cur->next;
            cur->next=newNode;
            m_size++;
        }
        else
            return;
    }
    
    void deleteAtIndex(int index) {
        if(index>=0&&index<m_size){
            LinkedNode* cur=_dummyhead;
            while(index--){
                cur=cur->next;
            }
            LinkedNode* tmp=cur->next;
            cur->next=cur->next->next;
            delete tmp;
            m_size--;
        }
    }
private:
    int m_size;
    LinkedNode* _dummyhead;
};

代码思路:代码随想录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值