leetcode707刷题打卡

简介: leetcode707刷题打卡

设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:valnextval 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

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

  • 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 库

解题思路:

独自解决的过程:

写完之后通过了63个测试用例,还差最后一个,经过一系列的debug,最终找到自己写的代码的核心问题,在实现按指定位置插入节点的时候,当指定位置大于该链表的长度的时候还是会插入进链表。原始按指定位置插入代码如下

void addAtIndex(int index, int val) {
    MyLinkedList *new_node = new MyLinkedList();  //创建一个新节点,即将按照指定位置插入原链表
    //初始化新节点
    new_node->val = val;
    new_node->next = NULL;
    MyLinkedList *cur_node = this;
    int cur_index = 0;
    while (cur_node->next && cur_index <= index) {
      if (cur_index == index) {
        break;
      }
      else {
        cur_index++;
        cur_node = cur_node->next;
      }
    }
    new_node->next = cur_node->next;
    cur_node->next = new_node;
  }

为该类添加一个新的属性,用来记录该链表的节点数

int size;(初始化为0)

于是在每个对节点个数操作内都加入对size的操作。

于是在addatindex函数内一开始增加一个判定,如果索引值超过了size则直接结束

修改后的代码如下:

void addAtIndex(int index, int val) {  //在指定位置插入数据时如果 索引超过了节点的个数则无法正常操作此函数
  if (this->size < index)
    return;
  MyLinkedList *new_node = new MyLinkedList();  //创建一个新节点,即将按照指定位置插入原链表
    //初始化新节点
  new_node->val = val;
  new_node->next = NULL;
  MyLinkedList *cur_node = this;
  int cur_index = 0;
  while (cur_index <= index) {
    if (cur_index == index) {
      new_node->next = cur_node->next;
      cur_node->next = new_node;
      this->size++;
      break;
    }
    else {
      cur_index++;
      cur_node = cur_node->next;
    }
  }
}

get函数的代码也许加一个判定,防止索引越界带来的访问错误

get代码如下:

int get(int index) {
  if (this->size <= index) return -1;
  int cur_index = 0;
  MyLinkedList *curprimer = this;  //可修改处
  while (cur_index <= index) {
    if (cur_index == index) {
      return curprimer->next->val;
    }
    else {
      cur_index++;
      curprimer = curprimer->next;
    }
  }
  return -1;
}

源代码如下:

class MyLinkedList {
public:
  MyLinkedList() {
    this->next = NULL;
    this->size = 0;
  }
  int get(int index) {
        if(this->size <= index) return -1;  // 洗个澡再看
    int cur_index = 0;
    MyLinkedList *curprimer = this;  
    while (cur_index <= index) {
      if (cur_index == index) {
        return curprimer->next->val;
      }
      else {
        cur_index++;
        curprimer = curprimer->next;
      }
    }
    return -1;
  }
  void addAtHead(int val) {
    MyLinkedList *new_node = new MyLinkedList(); //创建一个新节点,即将前插入原链表
    //初始化新节点
    new_node->val = val;
    new_node->next = NULL;
    //核心操作
    new_node->next = this->next;
    this->next = new_node;
    this->size++;
  }
  void addAtTail(int val) {
    MyLinkedList *new_node = new MyLinkedList();  //创建一个新节点,即将后插入原链表
    new_node->val = val;
    new_node->next = NULL;
    MyLinkedList *cur_node = this;
    //利用while循环将cur_node指向最后一个节点
    while (cur_node->next) {
      cur_node = cur_node->next;
    }
    new_node->next = cur_node->next;
    cur_node->next = new_node;
    this->size++;
  }
  void addAtIndex(int index, int val) {  //在指定位置插入数据时如果 索引超过了节点的个数则无法正常操作此函数
    if (this->size < index)
      return;
    MyLinkedList *new_node = new MyLinkedList();  //创建一个新节点,即将按照指定位置插入原链表
    //初始化新节点
    new_node->val = val;
    new_node->next = NULL;
    MyLinkedList *cur_node = this;
    int cur_index = 0;
    while (cur_index <= index) {
      if (cur_index == index) {
        new_node->next = cur_node->next;
        cur_node->next = new_node;
                this->size++;
        break;
      }
      else {
        cur_index++;
        cur_node = cur_node->next;
      }
    }
  }
  void deleteAtIndex(int index) {
    MyLinkedList *cur_node = this;
    int cur_index = 0;
    while (cur_node->next && cur_index <= index) {
      if (cur_index == index) {
        MyLinkedList *temp = cur_node->next;
        cur_node->next = temp->next;
        delete temp;
        this->size--;
        break;
      }
      else {
        cur_index++;
        cur_node = cur_node->next;
      }
    }
  }
  int val;
  int size;
  MyLinkedList* next;
};


相关文章
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
65 6
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
58 4
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
130 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
57 1
|
4月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
5月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
78 7
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
60 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
36 4
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
30 4