C++算法练习-day7——707.设计链表

news/2024/10/19 12:04:45/

题目来源:. - 力扣(LeetCode)

题目思路分析

在编程中,链表是一种常见的数据结构,用于存储一系列元素,但与数组不同,链表中的元素在内存中不必连续存储。每个元素(称为节点)包含数据部分和一个指向下一个节点的指针。本题要求我们实现一个自定义的链表MyLinkedList,支持以下操作:

  1. 获取指定位置的元素get(int index)方法,根据索引返回链表中的元素值,索引无效时返回-1。
  2. 在头部添加元素addAtHead(int val)方法,在链表头部插入一个新节点。
  3. 在尾部添加元素addAtTail(int val)方法,在链表尾部插入一个新节点。
  4. 在指定位置添加元素addAtIndex(int index, int val)方法,在链表的指定位置插入一个新节点。
  5. 删除指定位置的元素deleteAtIndex(int index)方法,删除链表中指定位置的节点。

为了高效实现这些操作,我们需要维护一个指向链表头部的指针(head),以及一个记录链表大小的变量(size)。使用虚拟头节点(dummy node)可以简化边界情况的处理,例如当index为0时,我们不需要特殊处理头部插入的情况。

代码实现与注解

实例:

#include <algorithm> // 为了使用std::max  struct ListNode {  int val;  ListNode *next;  ListNode(int x) : val(x), next(nullptr) {}  
};  class MyLinkedList {  
public:  MyLinkedList() {  this->size = 0;  // 使用虚拟头节点简化操作  this->head = new ListNode(0);  }  // 获取指定位置的元素值  int get(int index) {  if (index < 0 || index >= size) {  return -1; // 索引无效,返回-1  }  ListNode *cur = head;  for (int i = 0; i <= index; i++) { // 循环到目标位置的后一个节点  cur = cur->next;  }  return cur->val; // 返回目标节点的值  }  // 在头部添加元素  void addAtHead(int val) {  addAtIndex(0, val);  }  // 在尾部添加元素  void addAtTail(int val) {  addAtIndex(size, val);  }  // 在指定位置添加元素  void addAtIndex(int index, int val) {  if (index > size) {  return; // 索引超出链表长度,不执行任何操作  }  index = max(0, index); // 确保索引不小于0  size++; // 链表长度加1  ListNode *pred = head;  for (int i = 0; i < index; i++) {  pred = pred->next;  }  ListNode *add = new ListNode(val);  add->next = pred->next; // 新节点的next指向原位置的下一个节点  pred->next = add; // 原位置的节点指向新节点  }  // 删除指定位置的元素  void deleteAtIndex(int index) {  if (index < 0 || index >= size) {  return; // 索引无效,不执行任何操作  }  size--; // 链表长度减1  ListNode *pred = head;  for (int i = 0; i < index; i++) {  pred = pred->next;  }  ListNode *p = pred->next; // 待删除节点  pred->next = pred->next->next; // 跳过待删除节点  delete p; // 释放待删除节点的内存  }  private:  int size; // 链表长度  ListNode *head; // 链表头部指针(虚拟头节点)  
};

主函数部分:

int main() {  MyLinkedList* obj = new MyLinkedList();  obj->addAtHead(1);  obj->addAtTail(3);  obj->addAtIndex(1, 2); // 链表现在是1->2->3  cout << obj->get(1) << endl; // 输出2  obj->deleteAtIndex(1); // 删除索引1处的节点,链表现在是1->3  cout << obj->get(1) << endl; // 输出3  delete obj;  return 0;  
}

知识点摘要

  1. 链表的基本概念链表是一种链式存储结构,由一系列节点组成,每个节点包含数据部分和一个指向下一个节点的指针。
  2. 虚拟头节点:在链表头部添加一个不存储实际数据的虚拟节点,可以简化边界情况的处理。
  3. 动态内存管理:使用newdelete关键字在C++中管理动态内存,确保在不再需要时释放内存,防止内存泄漏。
  4. 时间复杂度分析getaddAtHeadaddAtTailaddAtIndexdeleteAtIndex方法的时间复杂度均为O(n),其中n为链表长度。这是因为这些方法在最坏情况下都需要遍历链表的一部分或全部节点。

通过实现自定义链表,我们不仅加深了对链表的理解,还学会了如何在实际编程中运用这些概念。


http://www.ppmy.cn/news/1540248.html

相关文章

MatrixOne助力江铜集团打造炉前智慧作业AIoT大数据系统

客户简介 江西铜业集团有限公司是世界500强企业&#xff0c;同时也是中国最大的铜生产商之一&#xff0c;成立于1979年&#xff0c;总部位于江西省南昌市。 公司专注于铜及其相关产品的开采、冶炼和加工&#xff0c;业务覆盖矿产资源开发、冶炼加工、产品制造和国际贸易等领域…

实践笔记 - 微服务架构下RESTful风格api之我为何抛弃了路由参数

在如今关于 RESTful API 的实践中&#xff0c;许多设计示例经常遵循类似以下的动态路径方案&#xff1a; 方案一&#xff1a;动态路径 方法路径描述GET/zoos列出所有的动物园POST/zoos新增一个新的动物园GET/zoos/{zoo}获取指定动物园详情PUT/zoos/{zoo}更新指定动物园DELETE…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

mysql学习教程,从入门到精通,SQL 约束(Constraints)(41)

在数据库设计中&#xff0c;约束&#xff08;Constraints&#xff09;用于确保数据的准确性和完整性。它们通过限制可以插入到数据库表中的数据类型来防止无效数据。SQL 中有几种常见的约束类型&#xff0c;包括主键约束&#xff08;Primary Key&#xff09;、外键约束&#xf…

M3D: Advancing 3D Medical Image Analysis with Multi-Modal Large Language Models

原文链接&#xff1a;https://arxiv.org/abs/2404.00578 研究背景 背景介绍: 这篇文章的研究背景是医学图像分析在临床诊断和治疗中至关重要&#xff0c;尤其是多模态大语言模型&#xff08;MLLMs&#xff09;在这一领域的应用。然而&#xff0c;现有的研究主要集中在2D医学图…

目标检测——Libra R-CNN算法解读

论文&#xff1a;Libra R-CNN: Towards Balanced Learning for Object Detection (2019.4.4) 作者&#xff1a;Jiangmiao Pang, Kai Chen, Jianping Shi, Huajun Feng, Wanli Ouyang, Dahua Lin 链接&#xff1a;https://arxiv.org/abs/1904.02701 代码&#xff1a;https://git…

如何给手机换ip地址

在当今数字化时代&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;扮演着举足轻重的角色。然而&#xff0c;有时出于隐私保护、网络访问需求或其他特定原因&#xff0c;我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法&#xff0c;帮助您轻松实现手机IP…

2024-10-18 问AI: [AI面试题] 神经网络有哪些不同类型?

文心一言 神经网络有多种不同类型&#xff0c;每种类型都有其特定的结构和应用场景。以下是一些主要的神经网络类型&#xff1a; 前馈神经网络&#xff08;FNN&#xff09;&#xff1a; 也称为全连接神经网络或感知器网络。由输入层、隐藏层和输出层组成&#xff0c;信息流是单…