【代码随想录】LC 707.设计链表

文章目录

前言

本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。

一、题目

1、原题链接

707.设计链表

2、题目描述


二、解题报告

1、思路分析

  1. 为了方便统一插入、删除操作等,使用虚拟头节点来统一操作。
  2. 各种操作具体思路
  • 获取第n个节点的值 :遍历找到第n个节点,获取该节点的val值进行返回即可。
  • 头部插入节点:将新节点指向原链表的头节点,再将虚拟头节点指向新节点。
  • 尾部插入节点 :找到尾部节点,将尾部节点的next指向新节点。
  • 第n个节点前插入:找到第n个节点的前一个节点(第n-1个节点),将新节点指向第n个节点,将第n-1个节点指向新节点。
  • 删除第n个节点:找到第n-1个节点,将第n-1个节点的next直接指向第n+1个节点,然后释放原来第n个节点的内存即可。

2、代码详解

cpp 复制代码
class MyLinkedList {
public:
    // 链表节点结构体
    struct ListNode {
        int val;
        ListNode* next;
        ListNode(int val): val(val), next(nullptr) {} //构造函数
    };
    MyLinkedList() {
        fakehead = new ListNode(0);
        list_len = 0; // 链表长度,即节点数
    }
    
    int get(int index) {
        // 异常情况处理:index为0为第一个节点
        // index合法区间为:[0, list_len - 1]
        if(index > (list_len - 1)|| index < 0) {
            return -1;
        }
        ListNode* cur = fakehead->next;
        while(index--) {
            cur = cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        ListNode* node = new ListNode(val);
        node->next = fakehead->next;
        fakehead->next = node;
        list_len++;
    }
    
    void addAtTail(int val) {
        ListNode* node = new ListNode(val);
        ListNode* cur = fakehead;
        while(cur->next != NULL) {
            cur = cur->next;
        }
        cur->next = node;
        list_len++;
    }
    
    void addAtIndex(int index, int val) {
        // index合法区间为[0, list_len]
        if (index > list_len || index < 0) {
            return ;
        }
        ListNode* node = new ListNode(val);
        ListNode* cur = fakehead;
        while(index--) {  // 寻找第index - 1个节点
            cur = cur->next;
        }
        // 插入节点的操作
        node->next = cur->next;
        cur->next = node;
        list_len++;
    }
    
    void deleteAtIndex(int index) {
        // index合法区间:[0, list_len - 1]
        if (index > (list_len - 1)|| index < 0) {
            return ;
        }
        ListNode* cur = fakehead;
        while(index--) { // 寻找第index - 1个节点
            cur = cur->next;
        }
        // 删除操作
        ListNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
        list_len--;
    }
private:
    int list_len;  // 链表长度
    ListNode* fakehead; // 虚拟头节点
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */

三、知识风暴

  • 链表具体操作并不难,重点是注意题目要求中的index,以及一些特殊情况、边界条件的判断和把控。
  • 同时注意struct结构体定义后需要有;
相关推荐
小陈phd8 小时前
多模态大模型学习笔记(七)——多模态数据的表征与对齐
人工智能·算法·机器学习
雨泪丶8 小时前
代码随想录算法训练营-Day35
算法
pursuit_csdn8 小时前
LeetCode 1022. Sum of Root To Leaf Binary Numbers
算法·leetcode·深度优先
NAGNIP9 小时前
一文搞懂神经元模型是什么!
人工智能·算法
董董灿是个攻城狮9 小时前
AI 视觉连载6:传统 CV 之高斯滤波
算法
雾岛听蓝10 小时前
C++11新特性(lambda、包装器)
c++·经验分享·笔记
散峰而望11 小时前
C++ 启程:从历史到实战,揭开命名空间的神秘面纱
c语言·开发语言·数据结构·c++·算法·github·visual studio
PingdiGuo_guo12 小时前
C++数据类型、变量常量
开发语言·c++
Ethan Hunt丶12 小时前
MSVTNet: 基于多尺度视觉Transformer的运动想象EEG分类模型
人工智能·深度学习·算法·transformer·脑机接口