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

代码随想录刷题 | Day2

今日学习目标

一、基础

  • 链表

接下来说一说链表的定义。

链表节点的定义,很多同学在面试的时候都写不好。

这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。

而在面试的时候,一旦要自己手写链表,就写的错漏百出。

这里我给出C/C++的定义链表节点方式,如下所示:

// 单链表
struct ListNode {int val;  // 节点上存储的元素ListNode *next;  // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

 有同学说了,我不定义构造函数行不行,答案是可以的,C++默认生成一个构造函数。

但是这个构造函数不会初始化任何成员变量,下面我来举两个例子:  

通过自己定义构造函数初始化节点:

ListNode* head = new ListNode(5);

 使用默认构造函数初始化节点:

ListNode* head = new ListNode();
head->val = 5;

所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!

二、算法

 1. 203. 移除链表元素

/*** 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) {while (head != NULL && head->val == val) {ListNode* p = head;head = head->next;delete p;}ListNode* cur = head;while (cur != NULL && cur->next != NULL) {if (cur->next->val == val) {ListNode* p = cur->next;cur->next = cur->next->next;delete p;} else {cur = cur->next;}}return head;}
};

2. 707.设计链表

#include <bits/stdc++.h>
using namespace std;class MyLinkedList {
public:// 定义链表节点结构体struct LinkedNode {int val;LinkedNode* next;LinkedNode(int val):val(val), next(nullptr){}};// 初始化链表MyLinkedList() {_dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点_size = 0;}// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点int get(int index) {if (index > (_size - 1) || index < 0) {return -1;}LinkedNode* cur = _dummyHead->next;while(index--){ // 如果--index 就会陷入死循环cur = cur->next;}return cur->val;}// 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点void addAtHead(int val) {LinkedNode* newNode = new LinkedNode(val);newNode->next = _dummyHead->next;_dummyHead->next = newNode;_size++;}// 在链表最后面添加一个节点void addAtTail(int val) {LinkedNode* newNode = new LinkedNode(val);LinkedNode* cur = _dummyHead;while(cur->next != nullptr){cur = cur->next;}cur->next = newNode;_size++;}// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点// 如果index大于链表的长度,则返回空// 如果index小于0,则在头部插入节点void addAtIndex(int index, int val) {if(index > _size) return;if(index < 0) index = 0;LinkedNode* newNode = new LinkedNode(val);LinkedNode* cur = _dummyHead;while(index--) {cur = cur->next;}newNode->next = cur->next;cur->next = newNode;_size++;}// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的void deleteAtIndex(int index) {if (index >= _size || index < 0) {return;}LinkedNode* cur = _dummyHead;while(index--) {cur = cur ->next;}LinkedNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;//delete命令指示释放了tmp指针原本所指的那部分内存,//被delete后的指针tmp的值(地址)并非就是NULL,而是随机值。也就是被delete后,//如果不再加上一句tmp=nullptr,tmp会成为乱指的野指针//如果之后的程序不小心使用了tmp,会指向难以预想的内存空间tmp=nullptr;_size--;}// 打印链表void printLinkedList() {LinkedNode* cur = _dummyHead;while (cur->next != nullptr) {cout << cur->next->val << " ";cur = cur->next;}cout << endl;}
private:int _size;LinkedNode* _dummyHead;};

3. 206.反转链表

class Solution {
public:ListNode* reverseList(ListNode* head) {if (head == NULL)return head;ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作ListNode* p = dummyHead->next;ListNode* q;dummyHead->next = NULL;while (p != NULL) {q = p;p = p->next;q->next = dummyHead->next;dummyHead->next = q;}return dummyHead->next;}
};

4. 24. 两两交换链表中的节点

#include <iostream>
#include <bits/stdc++.h>
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) {}
};
int main(){return 0;
}
ListNode* swapPairs(ListNode* head) {if (head==NULL || head->next==NULL) {return head;}ListNode *dummyHead = new ListNode(0);dummyHead->next = head;ListNode *cur  = dummyHead;ListNode *p,*q;while (cur->next!=nullptr &&cur->next->next!=nullptr) {p = cur->next;q = cur->next->next->next;cur->next = p->next;cur->next->next = p;cur->next->next->next = q;cur = cur->next->next;}return dummyHead->next;
}

5. 19.删除链表的倒数第N个节点

#include <bits/stdc++.h>
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) {}
};
int main(){return 0;
}
ListNode* removeNthFromEnd(ListNode* head, int n) {if(head==NULL) return NULL;ListNode *dummyNode = new ListNode();dummyNode->next = head;ListNode *p,*q;p=q=dummyNode;while (n--&&p!=nullptr) {p=p->next;}p=p->next;while(p!=nullptr&&q!=nullptr){p=p->next;q=q->next;}ListNode *temp = q->next;q->next = q->next->next;delete temp;return dummyNode->next;
}

6. 面试题 02.07. 链表相交

#include <bits/stdc++.h>
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) {}
};
int main(){return 0;
}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int aLen = 0;int bLen = 0;ListNode *pa = headA;ListNode *pb = headB;while(pa!=nullptr){aLen++;pa = pa->next;}while(pb!=nullptr){bLen++;pb = pb->next;}int k;pa = headA;pb = headB;if(aLen<=bLen){k = bLen - aLen;while (k-- && pb!=nullptr) {pb = pb->next;}while(pb!=nullptr){if(pa==pb){return pb;}pa = pa->next;pb = pb->next;}}else{k = aLen - bLen;while (k-- && pa!=nullptr) {pa = pa->next;}while(pa!=nullptr){if(pa==pb){return pa;}pa = pa->next;pb = pb->next;}}return NULL;
}
http://www.lryc.cn/news/269853.html

相关文章:

  • C++ enum class 如何使用
  • 攻防技术-单包攻击防范:扫描、畸形、特殊(HCIP)
  • 基于 Vue3 和 WebSocket 实现的简单网页聊天应用
  • 【MYSQL】MYSQL 的学习教程(八)之 12 种慢 SQL 查询原因
  • C语言例题3
  • 很实用的ChatGPT网站——httpchat-zh.com
  • Python函数中的*args,**kwargs作用与用法
  • python可视化界面自动生成,python如何做可视化界面
  • 力扣热题100道-双指针篇
  • 数据库一般会采取什么样的优化方法?
  • 编程笔记 html5cssjs 015 HTML列表
  • 【力扣题解】P404-左叶子之和-Java题解
  • elasticsearch 索引数据多了怎么办,如何调优,部署
  • Spring Cloud Gateway之Predicate断言详解
  • JavaScript中的prototype和_proto_的关系是什么
  • 机器学习(二) -- 数据预处理(3)
  • 【数学建模美赛M奖速成系列】Matplotlib绘图技巧(三)
  • 手写Spring与基本原理--简易版
  • EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了
  • python自动合计各部周销
  • Java内存区域与内存溢出异常
  • 远程网络唤醒家庭主机(openwrt设置)
  • Spring知识02
  • Linux服务器搭建笔记-006:拓展/home目录容量
  • 元宇宙与VR虚拟现实的未来如何?
  • 微服务事务处理:CAP 定理和最终一致性的关系
  • 【Linux操作系统】探秘Linux奥秘:操作系统的入门与实战
  • Copilot概述:AI助手引领编程新纪元
  • 最小覆盖子串(LeetCode 76)
  • Windows Sockets 2 笔记