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

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

时间:2023-12-01 22:34:39浏览次数:52  
标签:index 结点 cur val 随想录 next 链表 移除

LeetCode 203.移除链表元素

视频链接: LeetCode203

思路: 根据链表的性质,将目标值对应的节点保存在一个临时节点中,再重新设置cur下一个节点,再将临时节点进行删除

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //删除头节点
        while(head != NULL && head->val == val){
            ListNode * temp=head;
            head=head->next;
            delete temp;
        }
        ListNode* cur = head;
        while (cur != NULL && cur->next!= NULL) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next; //将目标值的节点保存在临时节点中,方便最后删除
                cur->next = cur->next->next; //将目标节点前一个节点和后一个节点进行连接
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};

LeetCode 707.设计链表

视频链接: LeetCode707

思路: 注释

class MyLinkedList {
private:
    struct Listnode{//定义链表结点结构体
        int val;//结点的值val
        Listnode* next;//结点的指针域next,指向下一个结点
        //三个Listnode构造函数
        Listnode():val(0),next(nullptr){}//参数为空
        Listnode(int v):val(v),next(nullptr){}//一个参数
        Listnode(int v,Listnode* n):val(v),next(n){}//两个参数
    };
    int len;//链表长度
    Listnode* dummyhead;//链表虚拟头结点
public:
    MyLinkedList() {//MyLinkedList构造函数
        len=0;//链表长度初始化为0
        dummyhead=new Listnode();//创建链表虚拟头结点
    }
    
    int get(int index) {//获取链表中第index个节点的值
        if(index<0||index>len-1) return -1;//索引无效返回-1
        Listnode* head=dummyhead->next;//dummyhead是虚拟头结点,而dummyhead->next是头结点
        while(index--) head=head->next;//找到第index个链表结点
        return head->val;//返回第index个链表结点的值val
    }
    
    void addAtHead(int val) {//在链表的第一个元素之前添加一个值为val的节点
        if(val<0||val>1000) return;//val值无效,直接返回
        Listnode* n=new Listnode(val);//新建值为val的链表结点n
        n->next=dummyhead->next;//将新链表结点n插入头结点前,新结点的指针域next为头结点指针,即新结点n的next指针指向头结点
        dummyhead->next=n;//虚拟头结点指针域next为新结点指针n,即虚拟头结点的next指针指向新结点n
        len++;//链表长度加一
    }
    
    void addAtTail(int val) {//将值为val的节点追加到链表的最后一个元素
        if(val<0||val>1000) return;//val值无效,直接返回
        Listnode* n=new Listnode(val),*cur=dummyhead;//新建值为val的链表结点n和当前结点指针变量cur
        while(cur->next) cur=cur->next;//通过cur找到链表中最后一个结点
        cur->next=n;//将新结点n插入链表末尾,即最后一个结点的指针域为新结点指针n
        len++;//链表长度加一
    }
    
    void addAtIndex(int index, int val) {//在链表中的第index个节点之前添加值为val的节点
        if(val<0||val>1000||index>len) return;//val值或index值无效,直接返回
        if(index<=0) addAtHead(val);//index<=0时,在头部插入值为val的新结点
        else if(index==len) addAtTail(val);//index=len时,在尾部插入值为val的新结点
        else{
            Listnode* n=new Listnode(val),*cur=dummyhead;//新建值为val的链表结点n和当前结点指针变量cur
            while(index--) cur=cur->next;//找到第index-1个链表结点
            n->next=cur->next;//将新链表结点n插入第index个链表结点前,新结点的指针域next为第index个链表结点的指针域next,即新结点n的next指针指向第index个链表结点
            cur->next=n;//第index个链表结点的指针域next为新结点指针n,即第index个链表结点的next指针指向新结点n
            len++;//链表长度加一
        }
    }
    
    void deleteAtIndex(int index) {//删除链表中的第index个节点
        if(index<0||index>len-1) return;//index值无效,直接返回
        Listnode* cur=dummyhead,*t=nullptr;//当前结点指针变量cur和临时结点t
        while(index--) cur=cur->next;//找到第index-1个结点
        t=cur->next;//t保存要删除的第index个结点
        cur->next=t->next;//第index-1个结点的指针域next为第index个结点的指针域next,即删除第index个结点
        delete t;//释放第index个结点的空间
        len--;//链表长度减一
    }
};

 

LeetCode 206.反转链表

视频链接: LeetCode206

思路: 

 

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev=nullptr;
        ListNode*curr=head;
        while(curr){
            ListNode* next=curr->next;
            curr->next=prev;
            prev=curr;
            curr=next;
        }
        return prev;
    }
};

 

标签:index,结点,cur,val,随想录,next,链表,移除
From: https://www.cnblogs.com/ygmzj/p/17870604.html

相关文章

  • 数据结构与算法之单链表-----黑马程序员(26-35)
    1.链表的概念在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素储存上并不连续。 创建链表如图所示和相关代码publicclassdanlianbiao{privateNodehead=null;//头部第一个结点privatestaticclassNode{//后面的每个结点intvalue;Nodene......
  • #yyds干货盘点# LeetCode程序员面试金典:奇偶链表
    题目给定单链表的头节点head,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是奇数,第二个节点的索引为偶数,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。你必须在O(1)的额外空间复杂......
  • 代码随想录day4链表2
    day424.两两交换链表中的节点19.删除链表的倒数第N个节点面试题02.07.链表相交142.环形链表II总结资料来源:代码随想录(programmercarl.com)5.两两交换链表中的节点classSolution{private:/*data*/public:Solution(/*args*/);~Solution();......
  • 代码随想录day3链表1
    链表理论基础203.移除链表元素707.设计链表206.反转链表资料来源:代码随想录(programmercarl.com)1链表理论基础定义:是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。......
  • 82. 删除排序链表中的重复元素 II
    82.删除排序链表中的重复元素II2021年3月25日​数据量300,数据大小[-200,200]​题意很简单,就考验你指针的使用。​两种方法桶排序暴力法思路很简单,加个100的偏移量,然后全都存下来,再倒着存进链表里返回即可。classSolution{public:ListNode*deleteDuplicates(......
  • 83. 删除排序链表中的重复元素
    83.删除排序链表中的重复元素2021年3月26日删除排序链表中的重复元素II的简化版,while套while就行为了时间,指针都不删除吗?classSolution{public:ListNode*deleteDuplicates(ListNode*head){ListNode*p=head;while(p&&p->next){w......
  • 61. 旋转链表
    61.旋转链表2021年3月27日将链表每个节点向右移动\(k\)个位置首先,假设链表长度为\(len\)当\(k<len\)时,相当于后\(k\)位移到前面当\(k>len\)时,令\(k\%=len\),然后再移动即可classSolution{public:ListNode*rotateRight(ListNode*head,intk){if(he......
  • 代码随想录day2
    977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II,总结1有序数组的平方​ 给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。2长度最小的子数组给定一个含有n个正整数的数组和一个正整数s,找出该数组中满......
  • day1数组理论基础,704. 二分查找,27. 移除元素
    数组理论基础,704.二分查找,27.移除元素1数组理论基础1.1数组概念定义:存放在连续内存空间上的相同类型数据的集合。特点:1.数组中数据类型相同2.数组所占空间连续1.2数组创建2704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    LeetCode704二分查找题目链接:LeetCode704左闭右闭:视频讲解:手把手带你撕出正确的二分法思路:在循环条件中注明left<=right,即[left,right]classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0,right=nums.size()-1......