以图明志

计算机数学与基础

编程需要懂多少数学知识?

基本的编程不需要很多
数学和编程有一种容易让人误解的联系。许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高。但一个人为了编程的话,需要学习多少数学呢? 实际上不需要很多。这篇文章中我会深入探讨编程中所需要的数学知识。你可能已经都知道了。

数据结构

栈的定义与大概理解

什么是栈
栈是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的找称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIF0结构。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指找顶,而不是栈底。

计算机数学与基础

给大学刚开始计算机课程同学的一封信

你应该这样开始学编程
大一到大四我一直渴望却始终没有一个导师,方向感全得是自己把握,所以我学的东西比较杂乱,没有形成一个系统,还得慢慢的补过来。你现在的基础比我当时好,因为你一直在学基础的东西,这很好。大学四年的唯一目标就是把基础理论掌握好,因为将来从事的工作可能和预想的不一样,方向太多了,大学就选择一个方向意义不大。

编程思想

掌握所有的编程语言并非不可能的事

抓住编程语言的本质
学习程序语言是每个程序员的必经之路。可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”。所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰。作为一个程序语言的研究者,我深深的知道这种心理产生的根源。程序语言里面其实有着非常简单,永恒不变的原理。

计算机数学与基础

让HTTP萌娘帮你记住状态码吧

附带喵星人的生动演示
Http 状态码是做Web开发的必备的基础知识,面试中也会经常出现这方面的考题。但是要记住全部的状态码不是一件容易的事,要不让 http状态码萌娘帮你记住一下?(PS:萌死不偿命噢。)觉得不够瘾?喵星人再给你演示一遍 http 状态码吧!

数据结构

删除单链表中的重复元素

遍历与比较
刚我在网上看到一个面试题,如何删除单链表中重复的元素。今天我们试着解决这个问题吧。建立三个工作指针p,q,r,然后p遍历全表。p每到一个结点,q就从这个结点往后遍历,并与p的数值比较,相同的话就free掉那个结点。思路也蛮简单的。

数据结构

单链表建环,无环链表变有环

设计一个链表建环函数
我们能否给一个无环链表建环呢?其实貌似也不很难,只要找到最后一个结点 tail,让它指向环的入口就行。所以问题分解为:找到环入口点 cur,把最后的指针 tail 指向 cur即可。首先找到环入口,也就是参数 num。定义工作指针 LinkList cur = *L; 让它遍历到 num 的位置。这个时候让第二个工作指针 tail 接替 cur 遍历到末尾。

数据结构

如何判断链表是否有环的存在

“快慢指针”的使用
有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过结点J之后,会重新回到结点D。如何判断一个单链表是否有环呢?这个可以用昨天提到的“快慢指针”来解决吧?设两个工作指针,一个快一个慢,如果有环的话,它们会必然在某点相遇。

数据结构

用标尺法快速找到单链表的中间结点

工作指针与标尺
昨天我们了解到“距离-标尺”的典型问题,再之前也学习了“工作指针”的概念,现在可以来解决一个腾讯的面试题了:如何快速找到未知长度单链表的中间结点。能否再优化一下这个时间复杂度呢?有一个很巧妙的方法:设置两个工作指针*search、*mid都指向单链表的头节点。其中* search的移动速度是*mid的2倍。当*search指向末尾节点的时候,mid正好就在中间了。这也是标尺的思想。

数据结构

求单链表倒数第N个数

“距离-标尺”问题
不管是顺数n个还是倒数n个,其实都是距离-标尺问题。标尺是一段距离可以用线段的两个端点来衡量,我们能够判断倒数第一个节点,因为他的next==NULL。如果我们用两个指针,并保持他们的距离为n,那么当这个线段的右端指向末尾节点时,左端节点就指向倒数第n个节点。

数据结构

单链表反转/逆序的第三种方法

建立一个新表来拷贝每个元素
昨天介绍了单链表逆序的两种方法,后来我又想到了第三种。我们就是要深入地研究每个细节嘛。这个方法比较简单,这里就直接上函数了。重新建立一个单链表newList,每次将list中的第一个结点放到newList后面。注释比较详细,所以就不具体说了。

数据结构

单链表反转/逆序的两种方法

比较两种思路的差异
我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来。比如下面是第一次交换,我们先让头结点的next域指向结点a2,再让结点a1的next域指向结点a3,最后将结点a2的next域指向结点a1,就完成了第一次交换。

数据结构

将单链表重置为空表

释放结点前需要处理后继关系
当我们不打算使用某个单链表时,就需要把它销毁,其实也就是在内存中将它释放掉,以便于留出空间给其他程序或软件使用。在循环体内直接写free (p); p=p->next; 这样真的没问题吗?要知道p是一个结点,它除了有数据域,还有指针域。在free (p); 时,其实是在对它整个结点进行删除和内存释放的工作。

数据结构

用尾插法实现单链表整表创建

与头插法的区别
昨天我们谈到了头插法,可事实上,我们还是可以不这样干,为什么不把新结点都放到最后呢,这才是排队时的正常思维,所谓的先来后到。我们把每次新结点都插在终端结点的后面,这种算法称之为尾插法。与头插法区别下?*L 是头结点,r这里的角色是尾结点,一开始他们是重合的。

数据结构

用头插法实现单链表整表创建

头插法其实就是从表头开始的插入操作
不知道有没有注意到,前面我们在谈“单链表插入操作”的时候,其实我们是用插入操作来完成了单链表的整表创建的。那么创建单链表的过程就是一个动态生成链表的过程。即从“空表”的初始状态起,依次建立各元素结点,并逐个插入链表。其实就是将 p->next 指向结点 (*L)->next,然后再将 结点 (*L)的后继指向p,这个很好理解。

数据结构

查找某数在单链表中的位置

单链表的元素查找
这里也同样需要用到“工作指针”。首先声明一个工作指针,并让它指向链表的首元结点 LinkList p=L->next。参数 L 其实就是头指针,L->next 就是头结点。然后用工作指针遍历链表,当 p->data 与传入的查找数 e 相等,返回其位置即可。
6 / 22 首页 < Prev 4 5 6 7 8 Next > 尾页 页码: