707. 设计链表

这篇具有很好参考价值的文章主要介绍了707. 设计链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

707. 设计链表

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。
class MyLinkedList{//初始化MyLinkedList对象
    public:
    //定义链表节点结构体
    struct LinkedNode{
        int val;
        LinkedNode *next;
        LinkedNode(int val):val(val),next(nullptr){}
    };
    int _size;
    LinkedNode* _dummyHead;
    MyLinkedList(){//定义链表
        _size=0;
        _dummyHead = new LinkedNode(0);
    }
    int get(int index){//获取链表下标为index的节点的值。如果下标无效,则返回-1
        if(index<0||index>(_size-1)) return -1;//index是从-1开始的,注意index范围
        LinkedNode* cur = _dummyHead->next;
        while(index--){
            cur=cur->next;
        }
        return cur->val;
    }
    void addAtHead(int val){//将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
        LinkedNode* newnode = new LinkedNode(val);//定义一个新的节点
        newnode->next = _dummyHead->next;
        _dummyHead->next = newnode;
        _size++;
    }

    void addAtTail(int val){
        LinkedNode* cur = _dummyHead;//定义一个新节点,指向虚头节点,有可能链表是空的
        while(cur->next!=nullptr){//找到尾结点
            cur=cur->next;
        }
        LinkedNode* newnode = new LinkedNode(val);//定义新节点
        cur->next = newnode;
        _size++;
    }
/*将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
*/
    void addAtIndex(int index, int val){//插入到节点的之前的
        if(index>_size) return;
        if(index<0) index=0;
        LinkedNode* pre=_dummyHead;//所以当前指针指向虚节点或index-1
        while(index--){
            pre=pre->next;
        }
        LinkedNode* newnode= new LinkedNode(val);//定义一个新的节点
        if(index==_size) pre->next=newnode;
        else{
            newnode->next = pre->next;
            pre->next = newnode;
        }
        _size++;
    }

    void deleteAtIndex(int index){//如果下标有效,则删除链表中下标为 index 的节点。
        if(index<0||index>(_size-1)) return;
        LinkedNode* pre=_dummyHead;//指向虚节点
        while(index--){
            pre=pre->next;
        }
        LinkedNode* tmp=pre->next;//指向当前节点
        pre->next=tmp->next;
        delete tmp;
        tmp=nullptr;//delete释放tmp指针原本所指的那部分内存
        /*被delete后指针tmp的值并非null,而是随机值,也就是被delete后,
        如果不再加上一句tem=nullptr,tmp会成为乱指的野指针
        */
        _size--;
    }
};

文章来源地址https://www.toymoban.com/news/detail-668347.html

到了这里,关于707. 设计链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法训练第三天|203.移除链表元素、707.设计链表、206.反转链表

    题目链接:力扣 思路:删除链表元素与数组不同之处在于,它需要被删除链表元素的前一个元素和后一个元素的参与,而不需要其他元素的参与。 我们使被删除元素前一个元素的指针指向被删除元素的后一个元素 ,也就是直接跳过被删除的元素,来实现删除。 同时我们考

    2024年02月05日
    浏览(40)
  • 代码随想录Day3 | 链表01-leetcode203、707、206

    题目链接:移除链表元素 思路: 链表中元素的添加和删除关键是要 保证不断链且指向关系正确 。对于删除操作,链的修改涉及将待删除元素的前一个元素指向待删除元素的后一个元素,因此在判断当前元素是否需要删除时,要记录当前元素的前后指针。 1.删除头结点时另作

    2024年02月16日
    浏览(68)
  • 第二章 链表_707.设计链表

    一、题目你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从

    2024年02月09日
    浏览(35)
  • LEEDCODE 707设计链表

    2024年02月06日
    浏览(19)
  • 707. 设计链表

    2024年02月11日
    浏览(15)
  • 力扣707设计链表

    你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性: val 和 next 。 val 是当前节点的值, next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性  prev  以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开

    2024年02月16日
    浏览(18)
  • 203.移除链表元素&707.设计链表& 206.反转链表

    203.移除链表元素: 给你一个链表的头节点  head  和一个整数  val  ,请你删除链表中所有满足  Node.val == val  的节点,并返回  新的头节点  。 707.设计链表  : 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。

    2024年02月11日
    浏览(35)
  • 203.移除链表元素|707.设计链表|206.反转链表

    203. 移除链表元素 这里以链表 1 4 2 4 来举例,移除元素4。 如果使用C,C++编程语言的话,不要忘了还要从内存中删除这两个移除的节点, 清理节点内存之后如图: 其实 可以设置一个虚拟头结点 ,这样原链表的所有节点就都可以按照统一的方式进行移除了。 来看看如何设置

    2024年02月11日
    浏览(44)
  • Day 3 链表: 203.移除链表元素, 707.设计链表, 206.反转链表

    链接基础,以及链表和数组的区别: 代码随想录 1. 链表类型: 单列表,双列表,循环列表。 单列表: 双列表: 循环列表: 2. 链表的操作 :删除节点,增加节点。 删除节点: 其中对于 普通的节点 删除,就如上图所示,直接让前一个节点的指向下一个节点即可。 但是对于

    2024年02月16日
    浏览(42)
  • day 3 | 203.移除链表元素、707.设计链表、206.反转链表

    目录: 链表基础:https://programmercarl.com/链表理论基础.html 题目链接: https://leetcode.cn/problems/remove-linked-list-elements/ 203. 移除链表元素 给你一个链表的头节点  head  和一个整数  val  ,请你删除链表中所有满足  Node.val == val  的节点,并返回  新的头节点  。 自己思路:从头

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包