当前位置: 首页 > news >正文

day3 203移除链表元素 707设计链表 206反转链表

203 移除链表元素

定义一个虚拟头节点
这样子可以不用分开处理头结点
统一了写法
思路就是找到cur -> next -> val,借助前一个节点,直接连接到后一个

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //new一个新指针
        //如果一开始不知道指针本身指向哪里,就要做初始化,否则成了野指针
        ListNode* dummyhead = new ListNode(0);
        //定义一个新指针,本身就指向了dummyhead
        ListNode* cur = dummyhead;//从dummyhead开始,不漏掉head
        dummyhead -> next = head;
        while(cur -> next != NULL) {
            if(cur -> next -> val == val) {
            cur -> next = cur -> next -> next;
            }
            else {
                cur = cur -> next;
            }
        }
        return dummyhead -> next;
    }
};

206 反转链表

这个题目相对容易,使用双指针
cur指向前一个pre,在这里做反向
二者都向后移动
用temp做记录防止丢失
是一个遍历的过程,注意初始化的处理,结束条件的处理

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

707设计链表

这个题费了很多时间,搞了两三天才搞明白
基本上把函数内部的功能搞清楚了,定义结构体还不太懂
get函数,注意cur刚好遍历到index的下标
前插函数,cur指向index前一个
删除函数,cur也指向index前一个
注意写语句的前后顺序

class MyLinkedList {
public:
    //什么意思?
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val) : val(val), next(nullptr) {}; 

    };
    //什么意思?
    MyLinkedList() {
        _dummyHead = new LinkedNode (0);
        _size = 0;
    }
    
    int get(int index) {//返回第index个节点的值,节点从0开始计数
        if(index < 0 || index > _size - 1) {
            return -1;
        }
        LinkedNode* cur = _dummyHead -> next;//相当于将cur挂到dummyhead后面,没有明确的head的定义
        while(index--) {
            cur = cur -> next;
        }
        return cur -> val;//这个下标没有问题,第index个节点对应的就是cur自己的值
    }
    
    void addAtHead(int val) {//在头结点之前插入val,
        LinkedNode* newnode = new LinkedNode {val};
        newnode -> next = _dummyHead -> next;//先走第二条边连接,再走第一条边
        _dummyHead -> next = newnode;//这个操作也没有问题,相当于只在dummyhead的地方操作,和后面没有关系
        _size++;
    }
    
    void addAtTail(int val) {//在尾结点之后插入val
        LinkedNode* cur = _dummyHead;
        while (cur -> next != NULL) {
            cur = cur -> next;
        }
        LinkedNode* newnode = new LinkedNode (val);
        //newnode -> next = cur -> next; 新节点的next自动是NULL
        cur -> next = newnode;//这个操作没有问题,cur遍历到最后一个节点,然后在这个之后插入
        _size++;
    }
    
    void addAtIndex(int index, int val) {//在第index个节点前插入,此时cur要指向index之前的一个节点
        if(index < 0) index = 0;
        if(index == 0) index = 0;//在头结点之前插入
        if(index > _size) return;
        if(index == _size) index = _size;//在尾结点之前插入
        LinkedNode* newnode = new LinkedNode (val);
        LinkedNode* cur = _dummyHead;//这个要特别注意,不是next
        while(index--) {
            cur = cur -> next;//特别注意,此时cur向前了一位,指向了index-1,而不是index
        }
        newnode -> next = cur -> next;
        cur -> next = newnode;
        _size++;
    }
    
    void deleteAtIndex(int index) {
        if(index < 0 || index >= _size) return;
        LinkedNode* cur = _dummyHead;//同样注意,提前了一个节点
        while(index--) {
            cur = cur -> next;//注意,cur停在了index前一个
        }
        LinkedNode* tmp = cur -> next;
        cur -> next = cur -> next -> next;
        delete(tmp);
        _size--;
    }
    //输出不懂
    void printLinkedList() {
        LinkedNode* cur = _dummyHead;
        while (cur->next != nullptr) {
            cout << cur->next->val << " ";
            cur = cur->next;
        }
        cout << endl;
    }
    //不懂
    private:
        int _size;
        LinkedNode* _dummyHead;
};

唉,搞得复杂无比。写的我头疼。烦死了,进度也跟不上。我这智商基本告别转码了。慢慢来吧,跟不上就跟不上了,本来也不是容易的事。

相关文章:

  • 金华大企业网站建设有哪些/百度首页广告
  • 营销网站建设定制/在线数据分析工具
  • 要怎样建设网站/2023年6月疫情情况
  • 新浪门户网站是谁做的/搜狗站长平台验证不了
  • 哪个网站可以做思维导图/网易搜索引擎入口
  • 不会写代码怎样做网站/如何建立和设计公司网站
  • 熟悉Spring框架?Spring容器使用流程,注解 你真的会吗?(让你一下通透~)
  • 【数据结构】图的案例引入及类型定义
  • 项目管理:项目控制的三个基本原则
  • 【Nginx 基础】
  • HuggingFace (transformers) 自定义图像数据集、使用 DeiT 模型、Trainer 进行训练回归任务
  • 华为OD在线编程题准备
  • XMind导入Markdown(利用Typora导出opml)
  • Flurry iOS端调研和使用
  • 【目标检测】55、YOLOv8 | YOLOv5 团队 Ultralytics 再次出手,又实现了 SOTA
  • 网络编程基础(1)
  • Dubbo快速入门看这一篇文章就够了
  • python实现给pdf文件加骑缝章效果