算法面试通关 40 讲
覃超
Sophon Tech 创始人,前 Facebook 工程师,卡内基梅隆大学计算机硕士
78356 人已学习
新⼈⾸单¥68
课程目录
已完结/共 62 讲
第二章:理论讲解+面试题实战 (53讲)
算法面试通关 40 讲
登录|注册
留言
99+
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 06 | 面试题:反转一个单链表&判断链表是否有环
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 合格程序员的第一步:算法与数据结构
02 | 如何事半功倍地学习算法与数据结构
03 | 如何计算算法的复杂度
04 | 如何通过LeetCode来进行算法题目练习
05 | 理论讲解:数组&链表
06 | 面试题:反转一个单链表&判断链表是否有环
07 | 理论讲解:堆栈&队列
08 | 面试题:判断括号字符串是否有效
09 | 面试题:用队列实现栈&用栈实现队列
10 | 理论讲解:优先队列
11 | 面试题:返回数据流中的第K大元素
12 | 面试题:返回滑动窗口中的最大值
13 | 理论讲解:哈希表
14 | 面试题:有效的字母异位词
15 | 面试题:两数之和
16 | 面试题:三数之和
17 | 理论讲解:树&二叉树&二叉搜索树
18 | 面试题:验证二叉搜索树
19 | 面试题:二叉树&二叉搜索树的最近公共祖先
20 | 理论讲解:二叉树遍历
21 | 理论讲解:递归&分治
22 | 面试题:Pow(x,n)
23 | 面试题:求众数
24 | 理论讲解:贪心算法
25 | 面试题:买卖股票的最佳时机
26 | 理论讲解:广度优先搜索
27 | 理论讲解:深度优先搜索
28 | 面试题:二叉树层次遍历
29 | 面试题:二叉树的最大和最小深度
30 | 面试题:生成有效括号组合
31 | 理论讲解:剪枝
32 | 面试题:N皇后问题
33 | 面试题:数独问题
34 | 理论讲解:二分查找
35 | 面试题:实现一个求解平方根的函数
36 | 理论讲解:字典树
37 | 面试题:实现一个字典树
38 | 面试题:二维网格中的单词搜索问题
39 | 理论讲解:位运算
40 | 面试题:统计位1的个数
41 | 面试题:2的幂次方问题&比特位计数问题
42 | 面试题:N皇后问题的另一种解法
43 | 理论理解:动态规划(上)
44 | 理论理解:动态规划(下)
45 | 面试题:爬楼梯
46 | 面试题:三角形的最小路径和
47 | 面试题:乘积最大子序列
48 | 面试题:股票买卖系列
49 | 面试题:最长上升子序列
50 | 面试题:零钱兑换
51 | 面试题:编辑距离
52 | 理论讲解:并查集
53 | 面试题:岛屿的个数&朋友圈(上)
54 | 面试题:岛屿的个数&朋友圈(下)
55 | 理论讲解: LRU Cache
56 | 面试题:设计和实现一个LRU Cache缓存机制
57 | 理论讲解:布隆过滤器
58 | 课程重点回顾
59 | FAQ答疑&面试中切题四件套
60 | 回到起点:斐波拉契数列
61 | 白板实战番外篇:斐波拉契数列
62 | 结课测试&最后的一些经验分享
本节摘要

课件获取

关注“极客时间”微信公众号,在后台回复“算法试看”,即可获取试看课程的 PDF 课件。

完整的 PDF 课件地址,购买课程后在非试看章节(第七节课开始)下面可获取下载链接。

反转一个单链表:

两两交换链表中的节点

判断链表是否有环:

环形链表

登录 后留言

全部留言(170)

  • 最新
  • 精选
空指针
之前一直以为像这样的语句 cur.next, prev, cur = prev, cur, cur.next 是一个一个分别按先后执行的,这次研究了一下,发现原来是先算好等号右边的所有值,然后一次性赋给左边...

作者回复: 对的! 一次性赋值

2018-10-19
10
62
geeklyc
老师, 1. 题目都不讲完,要自己去弄得话,那还不如百度搜索看看那不就得了,那我还来这看啥呢,肯定是想听听老师是怎么讲的呢 2. 说好的有c语言、python、java版本,暂时只看到python,并没看到其它两种,这不是有点骗人不

作者回复: 1 有些题目自己练习; 2 最好让自己对语言中性,主要看程序的逻辑。

2018-10-13
4
29
Wilson
判断链表是否有环,判断最后节点是否为null的方法应该不行。如果有环他就会无限圆环下去。所以觉得这个不行。副自己写的java代码实现老师说得三个示例 /** * 反转一个单链表。 * <p> * 示例: * <p> * 输入: 1->2->3->4->5->NULL * 输出: 5->4->3->2->1->NULL * * @param head * @return */ public ListNode reverseList(ListNode head) { if (head == null) { return head; } ListNode pre = head; ListNode cur = head.next; ListNode temp; while (cur != null) { temp = cur.next; cur.next = pre; pre = cur; cur = temp; } head.next = null; return pre; } /** * 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。如:给定 1->2->3->4, 你应该返回 2->1->4->3. * * @param head * @return */ public ListNode swapPairs(ListNode head) { ListNode dump = new ListNode(0); dump.next = head; head = dump; while (head.next != null && head.next.next != null) { ListNode n1 = head.next; ListNode n2 = head.next.next; head.next = n2; n1.next = n2.next; n2.next = n1; head = n1; } return dump.next; } /** * 判断是否环 * * @param head * @return */ public boolean hasCycle(ListNode head) { ListNode fast = head; ListNode slow = head; while (fast != null && slow != null && fast.next != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) { return true; } } return false; }

作者回复: 👍🏻👍🏻👍🏻 good

2018-10-16
3
17
子青
java没有python那么多语法糖,写起来肯定不一样。老师也说链表主要不是思维,是实现能力,所以还是希望有java、c版本的代码。

作者回复: 后续题目里会随机挑选其他不同语言。 我们题目的python代码里没有用什么特殊的语法,就是正常的逻辑语句

2018-10-14
12
伊燃
整个视频中最蠢的一句话..背下来...头一次听算法课,听别人讲不是理解,而是背下来,而且目前所有看下来给的最大帮助反而是分享的那个做题的网站

作者回复: 这位同学是典型的错误思维。绝大部分人可能都觉得算法是逻辑思维,所以理解即可,但是我既然在这门课开始强调你们要'背下来'肯定是有道理的。首先,我说背下来,并不是说只要傻背就够了,当然还要理解。但单纯理解却又是不够的,比如 关键的知识点,经典算法的思想和编程框架 都需要记下来,并且反复练习。背诵和理解要互相搭配,相辅相成,不然即使理解了后续还会忘记,而且在面试的时候由于压力大很容易结结巴巴,最后导致代码漏洞百出(这个在我面试别人的时候出现多次)。

2018-10-18
3
7
Sun0010
cur.next ,pre,cur = pre ,cur,cur.next 这个没看懂,怎么办

作者回复: python里的多变量赋值是一次性完成的操作。

2018-10-24
2
5
geeklyc
老师,不是有C语言实现的提供吗? struct ListNode* swapPairs(struct ListNode* head) { struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode)); //头节点 struct ListNode *pre = dummy; pre->next = head; while (pre->next != NULL && pre->next->next != NULL) { struct ListNode *a = pre->next; struct ListNode *b = a->next; struct ListNode *temp = b->next; pre->next = b; b->next = a; a->next = temp; pre = a; } return dummy->next; }

作者回复: 对的。可以使用你最擅长的语言练习一下。

2018-10-11
5
John
这一节第一个题用iteration很好想出来,但是用recursion的话还是挺难的,我想了很久才想出来一个很复杂费事的思路,LeetCode给出的答案要精妙很多。所以Recursive Linked List推荐大家一定要用递归做一遍

作者回复: 赞同。以及多看leetcode评论区里的高票回答的代码。

2019-10-26
2
geeklyc
本结课程C语言相关源码 https://liyoucheng2014.github.io/tags/%E9%93%BE%E8%A1%A8/

作者回复: 👍🏻👍🏻👍🏻

2018-10-13
2
geeklyc
老师,这是我的C语言实现 struct ListNode* reverseList(struct ListNode* head) { struct ListNode *cur; struct ListNode *prev; cur = head; prev = NULL; while(cur) { struct ListNode *temp = cur->next; cur->next = prev; prev = cur; cur = temp; } return prev; }

作者回复: 👍🏻👍🏻👍🏻

2018-10-11
2
收起评论