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

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

时间:2024-01-26 20:12:41浏览次数:37  
标签:ListNode temp val int 随想录 next 链表 移除

203.移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

题目链接:203. 移除链表元素 - 力扣(LeetCode)

注意c++中NULL和nullptr的区别。应该用nullptr来表示空指针。

/**
 * 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* temp = new ListNode(0);
        temp->next = head;
        ListNode* a = temp;
        while (a->next != NULL) {
            if (a->next->val == val) {
                ListNode* a_next = a->next;
                a->next = a_next->next;
                delete a_next;            //注意,用delete不用free,且delete之后不能再使用此指针,故每次释放都需新建指针
            } else {
                a = a->next;
            }
        }
            return temp->next;
    }

}
;

 

707.设计链表

题目链接:707. 设计链表 - 力扣(LeetCode)

一坨石这个题

runtime error: member access within null pointer of type

此类报错是指试图使用空指针,注意哪里可能遇到空指针。

查看代码

 
class MyLinkedList {
public:
    MyLinkedList() {
        this->size = 0;
        this->head = new ListNode(0);
    }

    int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode* cur = head;
        for (int i = 0; i <= index; 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 > size)
            return;
        index = max(0, index);
        size++;
        ListNode* pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred->next;
        }
        ListNode* toAdd = new ListNode(val);
        toAdd->next = pred->next;
        pred->next = toAdd;
    }

    void deleteAtIndex(int index) {
        if (index < 0 || index > size) {
            return;
        }
        size--;
        ListNode* pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred->next;
        }
        ListNode* p = pred->next;
        pred->next = pred->next->next;
        delete p;
    }

private:
    int size;
    ListNode* head;
};

 206.反转链表 

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

题目链接: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 *temp=new ListNode(0);
        ListNode *temp_next=new ListNode(0);
        ListNode *r=new ListNode(0);
        temp->next=head;
        if(temp->next!=nullptr)
        temp_next=head->next;
        else
        return head;
        head->next=nullptr;
        while(temp_next!=nullptr){
            r=temp_next->next;
            temp_next->next=temp->next;
            temp->next=temp_next;
            temp_next=r;
        }
    return temp->next;
    }
};

下面是一个更优化的写法,思路一致:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = NULL, *pre = head;
        while (pre != NULL) {
            ListNode* t = pre->next;
            pre->next = cur;
            cur = pre;
            pre = t;
        }
        return cur;
    }
};

注意pre在右,cur在左

标签:ListNode,temp,val,int,随想录,next,链表,移除
From: https://www.cnblogs.com/Liubox/p/17990583

相关文章

  • 【VMware vSAN】使用命令行从vSAN集群中移除ESXi主机并加入到新的vSAN集群。
    说明本文只是陈述了一种方法,不必评判谁对谁错谁好谁坏,选择适合自己的即可。 环境站点名称vCenter版本vSAN集群集群主机主机版本磁盘组vcsa67.lab.comvCenter6.7U3clusteresxi-b1.lab.comesxi-b2.lab.comesxi-b3.lab.comesxi-b4.lab.comESXi6.7U3......
  • 代码随想录 day30 回溯算法最高难度
    重新安排行程这个是关键然后利用数组或者map记录映射关系trueorfalse记录飞没飞过去重因为起飞和落地都可能重复有恰好tickets+1个地点就行这个代码比较贴近cpp的思路但是会超时这个用map的比较节约时间n皇后难点在于模拟棋盘数据处理以及回溯算法能不能......
  • leecode链表
    LCR_207题  回文链表给定一个链表的 头节点 head ,请判断其是否为回文链表。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。1classSolution{2publicbooleanisPalindrome(ListNodehead){3ListNodep=head;4......
  • 代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
    977.有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/错误的vector遍历方式,这会导致访问越界!!!while(nums[flag]<0)flag++;倒也不难,我......
  • [代码随想录] 第十四天
    222.完全二叉树的节点个数[https://leetcode.cn/problems/count-complete-tree-nodes/submissions/498293461/]思路:递归法classSolution{publicintmaxDepth(TreeNoderoot){if(root==null){return0;}intleftDepth=maxDep......
  • [代码随想录] 第十三天
    226.翻转二叉树[https://leetcode.cn/problems/invert-binary-tree/description/]递归:递归三部曲:①确定递归函数的参数和返回值②确定终止条件③确定单层递归的逻辑/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*T......
  • 代码随想录 day29 非递减子序列 全排列 全排列 II
    非递减子序列cpp就业还是太难了还是转java吧好歹这个对双非还友好一些尝试写java的第一天本题关键是理解非递减子序列判断条件需要额外一个数组记录当前元素是否在本树层使用过记录在这个数组就说明用过了全排列本题系统的演示了怎么写全排列和最基本的组合问题的......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html简单的二分查找法,核心是认识区间的意义,注意以下几点:middle=low+(low+high)/2;这种写法可以防止溢出。注意low和high的循环条件判断,如果是左闭右闭......
  • day25 代码随想录算法训练营 216. 组合总和 III
    题目:216.组合总和III我的感悟:还是按照之前的套路来。多了一个参数path_sum应该是有两处剪枝,1处横线剪枝,1处纵向剪枝?或者说1处求和剪枝?1处范围剪枝?【疑问】理解难点:不剪枝的已经模的差不多了,剪枝的再看看 自己听了一遍写的:[未剪枝]classSolution:defcombina......
  • remove 移除数据
    //云端代码constdb=uniCloud.database()exports.main=async(event,context)=>{constcollection=db.collection(event.name)constdocList=awaitcollection.where(event.data).get()if(!docList.data||docList.data.length===0){......