【代码随想录】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结构体定义后需要有;
相关推荐
txinyu的博客2 小时前
解析muduo源码之 Buffer.h & Buffer.cc
c++
Dave.B2 小时前
vtkPolyDataConnectivityFilter 实用指南
算法·vtk
阿猿收手吧!2 小时前
【C++】异常处理:catch块执行后程序如何继续
服务器·网络·c++
you-_ling2 小时前
数据结构:3.栈和队列
数据结构
代码游侠2 小时前
C语言核心概念复习(一)
c语言·开发语言·c++·笔记·学习
Once_day2 小时前
C++之《Effective C++》读书总结(3)
c语言·c++
蜕变的土豆2 小时前
grpc-通关速成
开发语言·c++
细节处有神明3 小时前
开源数据之历史气象数据的获取与使用
人工智能·python·算法