【代码随想录】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结构体定义后需要有;
相关推荐
吃好睡好便好4 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
于小猿Sup6 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
x_yeyue7 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao8 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
念何架构之路8 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星8 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
小小编程路8 小时前
C++ 多线程与并发
java·jvm·c++
失去的青春---夕阳下的奔跑8 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光9 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生