【代码随想录】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结构体定义后需要有;
相关推荐
cpp_250111 分钟前
P1024 [NOIP 2001 提高组] 一元三次方程求解
数据结构·c++·算法·题解·二分答案·洛谷·csp
田梓燊7 小时前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
re林檎7 小时前
算法札记——4.27
算法
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
数据牧羊人的成长笔记8 小时前
逻辑回归与Softmax回归
算法·回归·逻辑回归
郑州光合科技余经理8 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
张健11564096489 小时前
使用信号量限制并发数量
开发语言·c++
jc062010 小时前
6.1云原生之Docker
c++·docker·云原生
Mrlxl.cn10 小时前
计算机网络——网络层
c语言·数据结构·计算机网络·考研
d111111111d11 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法