首页 > 其他分享 >代码随想录训练营第三天 | 203.移处链表元素 707.设计链表 206.反转链表

代码随想录训练营第三天 | 203.移处链表元素 707.设计链表 206.反转链表

时间:2024-05-11 15:11:49浏览次数:16  
标签:current 203 listNode val 随想录 head next 链表

203.移除链表元素

题目链接 https://leetcode.cn/problems/remove-linked-list-elements/
文章讲解 https://programmercarl.com/0203.移除链表元素.html#算法公开课
视频讲解 https://www.bilibili.com/video/BV18B4y1s7R9/?vd_source=2b5b33d3d692b0064daff4e58957fc82
tips:对于链表操作leetcode中都是默认不带头节点的链表,题目中的头节点都是存储数据的,这样在移除元素的时候就需要根据是否是头节点而进行不同的操作,大大增加了代码的复杂度;一般考虑初始化一个虚拟的头节点来对链表进行操作;
删除节点时注意释放节点内存,避免内存泄漏

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 初始化一个虚拟头节点
        ListNode * dummy_head = new ListNode{};
        dummy_head->next = head;
        ListNode * p = dummy_head;

        while(p->next != nullptr) {
            if(p->next->val == val) {
                ListNode * temp = p->next;
                p->next = p->next->next;
                delete temp;
            } else {
                p = p->next;
            }
        }
        // 最终虚拟头节点的下一个节点就是所求链表的实际头节点
        return dummy_head->next;
    }
};

707.设计链表

题目链接 https://leetcode.cn/problems/design-linked-list/
文章链接 https://programmercarl.com/0707.设计链表.html#算法公开课
https://www.bilibili.com/video/BV1FU4y1X7WD/?vd_source=2b5b33d3d692b0064daff4e58957fc82

class MyLinkedList {
public:
public:
    struct listNode {
        int val;
        listNode * next;
        listNode(int _val): val(_val), next(nullptr) {}
    };
    MyLinkedList() {
        head = new listNode(0);
        size = 0;
    }
    
    int get(int index) {
        if (index >= size || index < 0) return -1;
        listNode * current = head->next;
        while(index--) {
            current = current->next;
        }
        return current->val;
    }
    
    void addAtHead(int val) {
        listNode * node = new listNode(val);
        node->next = head->next;
        head->next = node;
        ++size;
    }
    
    void addAtTail(int val) {
        listNode * current = head;
        while(current->next != nullptr) 
            current = current->next;
        current->next = new listNode(val);
        ++size;
    }
    
    void addAtIndex(int index, int val) {
        if(index > size) return ;

        listNode * current = head;
        for(int i = 0; i < index; ++i) {
            current = current->next;
        }
        listNode * temp = new listNode(val);
        temp->next = current->next;
        current->next = temp;

        ++size;
    }
    
    void deleteAtIndex(int index) {
        if(index > size - 1) return ;
        listNode * current = head;
        for(int i = 0; i < index; ++i) {
            current = current->next;
        }
        listNode * temp = current->next;
        current->next = current->next->next;
        delete temp;
        --size;
    }
private:
    int size;
    listNode * head;
};

206.反转链表

题目链接 https://leetcode.cn/problems/reverse-linked-list/description/
文章讲解 https://programmercarl.com/0206.翻转链表.html
视频讲解 https://www.bilibili.com/video/BV1nB4y1i7eL/?vd_source=2b5b33d3d692b0064daff4e58957fc82

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 初始化的状态应满足每次迭代的状态,可以画图来确定如何初始胡
        ListNode * current = head;
        ListNode * previous = nullptr;
        while(current) {
            head = current->next;  // 通过head保存current的下一个节点
            current->next = previous;
            previous = current;
            current = head;
        }
        // 循环结束时head为空, current为空, previous指向原链表最后一个节点
        return previous;
    }
};

标签:current,203,listNode,val,随想录,head,next,链表
From: https://www.cnblogs.com/cscpp/p/18186519

相关文章

  • 手撕链表(自存)
    #include<stdio.h>#include<stdlib.h>typedefintE;typedefstructnode{Eval;structnode*next;}ListNode;ListNode*list_creat(){ListNode*list=malloc(sizeof(ListNode));returnlist;}voidpush_back(ListNode*List......
  • 代码随想录训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
    977.有序数组的平方题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep暴力解时间复杂度O(nlogn)空间复杂度O(1)双指针法时间复......
  • 代码随想录算法训练营第第二天 | 977.有序数组的平方 、27. 移除元素
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep/***@param{number[]}nu......
  • 力扣刷题笔记-21 合并两个有序链表
    其实不回答就是答案双指针classSolution{publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){ListNodedummy=newListNode(-1);ListNodep=dummy;ListNodep1=list1,p2=list2;while(p1!=null&&p2!=nu......
  • 删除单向链表中数据最小的结点
    (1)算法的基本设计思想要找到链表中数据最小的结点,可以使用4指针法。具体步骤如下:定义4个指针,分别命名为MinNodeprev、MinNode、CurrentNodePrev、CurrentNode,MinNodeprev、CurrentNodePrev指向链表的头结点,MinNode、CurrentNode指向链表的首结点。同时移动CurrentNodePrev、Cur......
  • 代码随想录算法训练营第第一天 | 704. 二分查找 、27. 移除元素
    704、二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715`varsearch=function(nums,target){letleft=0;letright=nums.length;letmi......
  • 23. 合并 K 个升序链表
    23.合并K个升序链表https://leetcode.cn/problems/merge-k-sorted-lists/?envType=study-plan-v2&envId=top-interview-150 思路K个升序链表,依据显然的规则:当前最小的值,肯定出自于K个升序链表的K个表头中,对这K个表头使用最小堆(priority_queue)进行管理,pop出的堆顶值,就......
  • 代码随想录算法训练营第一天 | 704.二分查找 27.移除元素
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文档讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715左闭右开时间复杂度O(logn)空间复杂度O(1)classSolution{public:intsearch(......
  • 关于单向不循环链表的创建、插入、删除、遍历、检索
    关于单向不循环链表的创建、插入、删除、遍历、检索单向不循环链表公式初始化单向不循环链表构建单向不循环链表结构体//创建结构体类型typedefstructone_way_node{//数据域chardata[DATA_LEN];//指针域structone_way_node*next;}ONE_WAY_NOD......
  • Leetcode --- 203. 移除链表元素
    题目描述给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。示例1: 示例输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]输入:head=[7,7,7,7],val=7输出:[]参考实现方式1、使用递归实现......