⚓️作者简介:即将大四的北京某能源高校学生。
座右铭:“九层之台,起于垒土” 。所以学习技术须脚踏实地。
这里推荐一款刷题、模拟面试神器,可助你斩获大厂offer:点我免费刷题、模拟面试
牛客网是一个集笔面试系统、题库、课程教育、社群交流、招聘内推于一体的招聘类网站,更是一个专注于程序员的学习和成长的平台。
在某次浏览博客的过程中,我偶然点进一个链接,注册了牛客账号。一来到牛客首页,我就被其丰富的功能与良好的社区环境所吸引:
进入题库,更是有最新校招试题与专项练习:
在线编程更是有在线调试功能,可大大提高debug效率:
问答题下还有超多牛客用户交流:
总之,牛客是一个专注于程序员的学习和成长的平台,所以我极力推荐大家注册牛客,坚持刷题,充实自己,大厂offer便指日可待。
链表,别名链式存储结构或单链表,用于存储逻辑关系为 “一对一” 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。
下面来刷几个链表题练练手
方法一: 使用快慢指针
C++解题代码:
本着“Talk is cheap. Show me the code”的原则,直接上代码:
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *fast = head, *slow = head;
while(fast && fast->next){
fast = fast->next->next;
slow = slow->next;
if(slow == fast) return true;
}
return false;
}
};
时间复杂度:假设fast超前slow d 个节点,环周长 C,则需要 C-d 步 fast才能追上 slow。需要的总步数为 n-d。时间复杂度为 O ( n ) O(n) O(n)。
空间复杂度:只需维护fast与slow,空间复杂度为 O ( 1 ) O(1) O(1)。
一个链表从头节点开始一个个删除,所谓删除就是让他的next指针指向他自己。如果没有环,从头结点一个个删除,最后肯定会删完,如下图所示
参考图片
如果是环形的,那么有两种情况,一种是o型的,一种是6型的。原理都是一样,我们就看一下o型的:
如上图所示,如果删到最后,不论是o型的还是6型的肯定会出现head=head.next。
C++解题代码:
class Solution {
public:
bool hasCycle(ListNode *head) {
while(head && head->next){
ListNode *next=head->next;
if(next==head) return true;
head->next=head;
head=next;
}
return false;
}
};
时间复杂度:程序到链表最后一个节点处结束循环,时间复杂度为 O ( n ) O(n) O(n)。
空间复杂度:程序只需维护fast与slow,空间复杂度为 O ( 1 ) O(1) O(1)。
利用上一题的方法二,当上题程序确认程序有环时,head指针刚好走到环的入口处,所以当走到入口时直接返回节点即可得解:
C++解题代码:
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
while(pHead && pHead->next){
ListNode *next=pHead->next;
if(next==pHead) return next;
pHead->next=pHead;
pHead=next;
}
return NULL;
}
};
时间复杂度:程序到链表最后一个节点处结束循环,时间复杂度为 O ( n ) O(n) O(n)。
空间复杂度:程序只需维护fast与slow,空间复杂度为 O ( 1 ) O(1) O(1)。
我希望通过写博客来结束浑浑噩噩的生活,我更希望通过刷题结束人云亦云的思考。朋友们,刷题不仅仅是刷题,还是我们与自己内心深处的对话。希望我们可以一起在牛客刷题交流,一起收割大厂offer