LeetCode 707.设计链表

class MyLinkedList {
public:
    struct node{
        int val;
        node *next;
        node(int v) : val(v), next(nullptr){}
    };
    
    int len;
    node *head, *end;
    
    MyLinkedList() {
        len = 0;
        node *n = new node(0);
        head = n;
        end = n;
    }
    
//get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
    int get(int index) {
        if(index >= len || index < 0)
            return -1;
        node *n = head;
        for(int i = 0; i < index; ++i)
            n = n->next;
        return n->val;
    }

只要判断index是否合法后不断调用next即可。

//addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
    void addAtHead(int val) {
        if(len == 0)
            head->val = val;
        else{
            node *n = new node(val);
            n->next = head;
            head = n;
        }
        ++len;
    }

如果链表长度为0只需要改变head的值,否则new一个node,新的node的next指向头链表,头链表等于新的node

 //addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。*/
    void addAtTail(int val) {
        if(len == 0)
            head->val = val;
        else{
            node *n = new node(val);
            end->next = n;
            end = n;
        }
        ++len;
    }

如果链表长度为0只需要改变head的值,否则new一个node,新的node的next指向尾链表,尾链表等于新的node

/*addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。*/
    void addAtIndex(int index, int val) {
        if(index > len)
            return;
        else if(index <= 0){
            addAtHead(val);
            return;
        }
        else if(index == len){
            addAtTail(val);
            return;
        }
        node *n = head;
        node *n1 = new node(val);
        for(int i = 0; i < index - 1; ++i)
            n = n->next;
        n1->next = n->next;
        n->next = n1;
        ++len;
    }

判断输入的index是否合法,然后使用for循环使n到达指定链表块的前一个,new一个要插入的链表块n1,让n1的下一个链表块指向n的下一个链表块,然后使n的指向的下一个链表块变成n1。
原本的链表
原本的链表
新的链表
新的链表

//deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
    void deleteAtIndex(int index) {
        if(index >= len || index < 0)
            return;
        else if(index == 0){
            head = head->next;
            --len;
            return;
        }
        node *n = head;
        for(int i = 0; i < index - 1; ++i){
            n = n->next;
        }
        n->next = n->next->next;
        if(index==len-1)
        {
            end=n;
        }
        --len;
    }
};

判断index是否合法,做法和插入相反而已,找到前一个链表块,使前一个链表块之间指向下一个链表块即可。

原本的链表
原本的链表
新的链表
新的链表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值