首页 > 编程语言 >代码随想录算法训练营第三天 | 203.移除链表元素 、 707.设计链表 、206.反转链表

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

时间:2024-07-06 22:30:41浏览次数:28  
标签:ListNode cur val int 随想录 next 链表 移除 tem

203.移除链表元素

题目:. - 力扣(LeetCode)

思路:主要是通过运用虚拟头节点来统一移除元素的写法。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
    ListNode* virhead=new ListNode(0,head);
    ListNode* cur=virhead;
    while(cur->next!=NULL){
        if(cur->next->val==val){
            ListNode* tem=cur->next;
            cur->next=cur->next->next;
            delete tem;
        }
        else
        cur=cur->next;
    }
    return virhead->next;
    }
};

707.设计链表

题目:. - 力扣(LeetCode)

思路:通调用增加结点函数来实现增加头节点和增加尾结点,难点是循环次数比较容易弄乱。

代码:

class MyLinkedList {
public:
    struct ListNode{
        int val;
        ListNode* next;
        ListNode():val(0),next(NULL){};
        ListNode(int i):val(i),next(NULL){};
    };
    ListNode* virhead;
    int size;
    MyLinkedList() {
    virhead=new ListNode(0);
    size=0;
    }
    
    int get(int index) {
    if(index<0||index>size-1)
    return -1;
    ListNode* cur=virhead;
    for(int i=0;i<index+1;i++){
    cur=cur->next;
    }
    return cur->val;
    }
    
    void addAtHead(int val) {
    addAtIndex(0,val);
    }
    
    void addAtTail(int val) {
    addAtIndex(size,val);
    }
    
    void addAtIndex(int index, int val) {
    if(index<0||index>size)
    return;
    ListNode* cur=virhead;
    ListNode* tem=new ListNode(val);
    for(int i=0;i<index;i++){
        cur=cur->next;
    }
    tem->next=cur->next;
    cur->next=tem;
    size++;
    }
    
    void deleteAtIndex(int index) {
    if(index<0||index>size-1)
    return;
    ListNode* cur=virhead;
    for(int i=0;i<index;i++){
        cur=cur->next;
    }
    ListNode* tem=cur->next;
    cur->next=cur->next->next;
    delete tem;
    size--;
    }
};

/**
 * 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);
 */

206.反转链表

题目:. - 力扣(LeetCode)

思路:翻转的关键是每次要保存当前结点的前结点。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    ListNode* pre=NULL;
    ListNode* cur=head;
    while(cur!=NULL){
        ListNode* tem=cur->next;
        cur->next=pre;
        pre=cur;
        cur=tem;
    }
    return pre;
    }
};

标签:ListNode,cur,val,int,随想录,next,链表,移除,tem
From: https://blog.csdn.net/dtgfhfd/article/details/140233425

相关文章

  • 代码随想录刷题day 4 | 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题
    24.两两交换链表中的节点迭代的版本:最重要的就是要知道循环变量怎么取,对于这道题,我们只需要存储需要交换的两个节点的前一个节点即可,只有当这个节点后面有两个节点时才进入循环,其实把握住这一点之后这题就非常容易了。递归的版本:这道题用递归做简直不要太简单,首先明白递归结束......
  • 数据结构——(双)链表
    文章目录1. 定义2. 双链表和单链表的区别3.代码示例3.1双链表节点和结构定义3.2初始化双链表3.3 返回双链表的长度3.4 在指定位置插入元素3.5 在末尾插入元素3.6 删除指定位置的元素并返回被删除的元素3.7 删除末尾元素3.8获取指定位置的元素3.9修改指......
  • 数据结构——单向循环链表
    文章目录1.概念2. 区别2.1结构区别2.2访问方式区别2.3优缺点对比3.流程4. 基本操作5.代码示例1.概念单向循环链表是一种特殊的单链表,其中最后一个节点的后继指针指向头节点,形成一个环。单向循环链表适合用于需要循环访问数据的场景,如约瑟夫环问题。节点......
  • 代码随想录算法训练营第五十六天 | 98.所有可达路径
    98.所有可达路径题目链接文章讲解邻接矩阵法邻接矩阵使用二维数组来表示图结构。邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组为了节点标号和下标对其,有n个节点的图申请(n+1)*(n+1)的空间vector<vector<int>>graph(n+1,vector<int>(n+1,0)......
  • 代码随想录算法训练营第二天 | 203.移除链表元素 707.设计链表 206.反转链表
    代码随想录算法训练营第二天|203.移除链表元素707.设计链表206.反转链表进入链表章节,就要和虚拟头结点(dummyhead)打交道了,还要注意边界条件和空指针异常移除链表元素题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A......
  • 「代码随想录算法训练营」第四天 | 链表 part2
    24.两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/题目难度:中等文章讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#算法公开课视频讲解:https://www.bilibili.com/video/BV1YT411g7br题目状态:有思路,但细节缺乏考虑个......
  • 代码随想录算法训练营第3天 | 链表删除元素
    删除链表元素,技巧是设置一个虚拟头节点,这样就可以把原始头节点当做普通节点处理了,最后再返回虚拟头结点的next即可。题203.移除链表元素/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*......
  • 代码随想录day15 平衡二叉树 | 二叉树的所有路径 | 左叶子之和 | 完全二叉树的节点个
    平衡二叉树平衡二叉树解题思路二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。这道题由于需要求节点的高度差来进行判断,因此我们需要用后序遍历,先左右,后中间。推荐使用递归把每个节点的高度算出来......
  • 代码随想录算法训练营第五十五天 | 42.接雨水 84.柱状图中最大的矩形
    42.接雨水题目链接文章讲解视频讲解思路找到当前柱子左边第一个比它高的和右边第一个比它高的柱子进行计算,右边第一个比它搞得柱子可以循环遍历得到,左边第一个比它高的柱子就是栈中下一个元素classSolution{public:inttrap(vector<int>&height){stack......
  • 代码随想录算法训练营第五十三天 | 739.每日温度 496.下一个更大的元素I 503.下一个更
    739.每日温度题目链接文章讲解视频讲解单调栈适合的场景:求当前元素左面或右面第一个比它大或小的元素单调栈里存什么元素只要存下标就可以了,比较元素时可以通过下标取元素单调栈是单调增还是单调减(从栈顶到栈底)使用单调增的单调栈解题步骤:遍历数组,当栈空时直接入栈......