传送门:力扣

答案在文后/

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

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

示例:

MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2);   //链表变为1-> 2-> 3
linkedList.get(1);            //返回2
linkedList.deleteAtIndex(1);  //现在链表是1-> 3
linkedList.get(1);            //返回3

提示:

所有val值都在 [1, 1000] 之内。
操作次数将在  [1, 1000] 之内。
请不要使用内置的 LinkedList 库。

涉及:虚拟头节点的建立

在之前的移动链表位置的文章中,链表移除元素复盘_BanTanger的博客-CSDN博客,使用的方法是移动head节点的方法来移除元素,但这种方法需要做一个是否移除元素属于头节点的判断,这里通过虚拟头节点_dummyNode的设置,可以很简单的移除元素

详细代码:

#include<iostream>
using namespace std;class MyListNode {
public:struct ListNode {int val;ListNode* Next;ListNode(int v) :val(v), Next(NULL) {}};//链表的初始化MyListNode(){_dummyHead = new ListNode(0);_size = 0;}//获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点int get(int index) {if (index > (_size - 1) || index < 0) {return -1;}ListNode* cur = _dummyHead->Next;while (index--) { // 如果--index 就会陷入死循环cur = cur->Next;}return cur->val;}//头节点插入元素void AddOfHead(int val) {ListNode* newNode = new ListNode(val);newNode->Next = _dummyHead->Next;_dummyHead->Next = newNode;_size++;}//尾节点插入元素void AddOfTail(int val) {ListNode* newNode = new ListNode(val);ListNode* current = _dummyHead;while (current->Next != NULL) {current = current->Next;}current->Next = newNode;//这里因为在构造函数中已经构造出节点默认指向是NULL,所以可以不用像C那样写出指向NULL_size++;}//索引添加元素void AddOfIndex(int index, int val) { //index合法性检验if (index > _size) {return;}ListNode* newNode = new ListNode(val);ListNode* current = _dummyHead;//将current节点指向虚拟头节点,达到index==0时插入的元素在头节点之后。while (index--) {current = current->Next;}newNode->Next = current->Next;current->Next = newNode;_size++;}//删除操作void deleteIndex(int index) {//对删除的位置判断if (index > _size || index < 0) {return;}ListNode* current = _dummyHead;while (index--) {current = current->Next;}ListNode* tmp = current->Next;current->Next = current->Next->Next;delete tmp;_size--;}//打印链表void PrintListNode() {ListNode* current = _dummyHead;while (current->Next != NULL) {cout << current->val << " ";current = current->Next;}cout << endl;}
private:int _size;ListNode* _dummyHead;
};

Leetcode 707.设计链表相关推荐

  1. leetcode 707 设计链表

    设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...

  2. LeetCode 707. 设计链表(List)

    文章目录 1. 设计一个单链表 2. 双向链表 1. 设计一个单链表 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值.如果索引无效,则返回-1. addAtHea ...

  3. LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)

    文章目录 一.编程题:707. 设计链表(双向链表-带头尾双结点) 1.题目描述 2.示例1: 3.提示: 二.解题思路 1.思路 2.复杂度分析: 3.算法图解(双向链表) 三.代码实现 三.单向链 ...

  4. 力扣707设计链表(单链表,JavaScript)

    1,头指针指向列表第一个元素,尾指针指向链表最后一个元素,链表末尾的index=this.size-1 var MyLinkedList = function() {this.size=0this.h ...

  5. Suzy找到实习了吗Day 3 | 链表开始啦 203移除链表元素 707设计链表 206 反转链表

    定义链表的结构 class ListNode:def __init__(self, val, next=None): #构造函数self.val = valself.next = next 尾部nod ...

  6. C#LeetCode刷题-链表

    链表篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 19 删除链表的倒数第N个节点   29.4% 中等 21 合并两个有序链表 C#LeetCode刷题之#21-合并两个有序链 ...

  7. day03链表基础_移除链表元素_设计链表_反转链表

    链表理论基础 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思). 链表的入口节点称 ...

  8. My Seventh Page - 设计链表 - By Nicolas

    这一篇page对应的是leetcode上面707.设计链表这个题目,首先这个题目的描述还是比较简单的,就是我们可以选择使用单链表或者双链表实现链表对应的增删改查的许多功能.小尼这个题目大部分都是看的题 ...

  9. 设计链表(单链表、双链表)

    707. 设计链表 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表 ...

最新文章

  1. oracle10.2 迁移,实战:Oracle10.2.0.4异机迁移并升级到Oracle 11.2.0.4
  2. 学习js,尝试写一个表单验证框架(1)-规划
  3. nginx http proxy 正向代理
  4. 你知道长颈鹿是怎么睡觉的吗? | 今日趣图
  5. ROS 教程之 vision: 摄像头标定camera calibration
  6. 【NOIP1999】【Luogu1020】导弹拦截
  7. RxJava Subject
  8. android方向传感器 指南针,Android 方向传感器的两个应用:指南针和水平仪
  9. 瑞幸突击2018,一场互联网向咖啡发起的进攻 | 一点财经
  10. fluent使用DPM模型计算出的颗粒沉积(trap)数据(.dpm格式)后处理python实现
  11. 微信小程序 手写签名_你竟然还不知道在微信上就可以手写签名、签文件了~
  12. 开源免费3D CAD软件:FreeCAD
  13. 橙色优学:互联网对传统行业说是机会,对年轻人来说更是风口
  14. xposed框架的检测和反制
  15. 使用数据库进行用户身份认证
  16. 项目组长成长记(一)
  17. h5页面跳转微信小程序。
  18. Android App修改字体大小,且不随系统字体大小更改
  19. 国产浏览器的创新之路,拼的就是用户体验
  20. 软件产品界面设计-培训PPT发布

热门文章

  1. 独家 | 2021双11背后的数据库硬核科技
  2. IoT Studio可视化搭建平台编辑历史功能的思考与探索
  3. Quick BI电子表格: 新手亦可表格自由
  4. 如何在Spring生态中玩转RocketMQ?
  5. 从OpenKruise用户疑问开始理解K8s资源更新机制
  6. 如何调用API管理您的云上资源
  7. 能用机器完成的,千万别堆工作量|持续集成中的性能自动化测试
  8. 新功能:阿里云负载均衡SLB支持HTTP访问强制跳转HTTPS
  9. 阿里智能运维平台如何助力研发应对双11挑战
  10. stack vs heap:栈区分配内存快还是堆区分配内存快 ?