递归和动态规划——斐波拉契数列的递归 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 【斐波拉契(Febonacci)数列原始问题】如果一对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月,又能开始生1对小兔子,假定在不发生死亡的情况下,由1对初生的兔子开始,1年后能繁殖成多少对兔子?斐波拉契把推算得到的头几个数摆成一串:1,1,2,3,5,8……F(n)=F(n-1)+F(n ... Read more »
二叉树——二叉树先序、中序和后续遍历 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 任何一个二叉树,都可以由它的先序和中序遍历唯一确定。 任何一个二叉树,都可以有它的中序和后序遍历唯一确定。 123456789101112131415161718192021222324252627// 使用递归先序遍历public static void preOrderRecur(TreeNod ... Read more »
二叉树——用递归或循环的方式实现二叉树遍历 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 递归即使利用函数栈来保存信息。非递归:利用自己申请的数据结构来代替函数栈. 实现: 申请一个新栈stack,将头节点head压入stack.。 从stack中弹出栈顶节点,记为cur,然后打印cur的值。将cur右孩子(不为空的话)压入stack中,再将cur的左孩子(不为空的话)压入stack。 ... Read more »
链表——两个链表生成相加链表 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 题目:假设链表中的每个节点都在0~9之间,那么链表整体就可以表示一个整数,如9->3->7链表加上6->3链表,最后生成的链表是1->0->0->0。 思考:若将两个链表分别转换成整数相加,最后将和转换成链表,由于链表可能很长,会造成整数溢出,不推荐。 实现:注意 ... Read more »
链表——复制含有随机指针的链表 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 题目:随机指针是指指针的指向是随机的。 实现:利用HashMap的key-value结构 将所有链表的值进行复制,利用HashMap结构 将所有指针进行复制1’.next = 2’ 12345678910111213141516171819202122232425import java.util ... Read more »
链表——将单向链表划分成左边小、中间相等、右边大的形式 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 题目:将单向链表按某值划分成左边小、中间相等、右边大的形式(其中每部分的顺序与在原链表中的顺序相同). 实现: 将原链表中的所有节点分到三个独立链表中,每个链表分别存储比k小的值,与k相等的值和比k大的值。 最后把这三个链表串联起来。注意对null节点的判断。 12345678910111213 ... Read more »
链表——判断一个链表是否是回文结构 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 实现:利用栈先进后出的特点。设链表长为N 若N为偶数,则将链表右边N/2部分的数据压入栈,全部出栈后判断它是否与原链表的左边N/2部分的数据相同。 若N为奇数,则忽略中间的数,将右边(N-1)/2的内容压入栈,检查栈顶到栈底值是否与左边(N-1)/2部分的内容相同。(注意:题目中的是回文结构与有回 ... Read more »
链表——反转部分单向链表 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 题目:反转部分单向链表,如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1)。如果不满足1<=from<=to<=N则不用调整。 实现: 先判断是否满足1<=from<=to<=N,不满足就不需要调整,直接返回头节点。 找到需要反转部分的前一 ... Read more »
链表——反转单向和双向链表 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 题目:反转单向链表,函数返回新链表的头节点。 实现:方法一:最简单的就是使用栈,但复杂度为O(N)。 方法二:在原来链表上进行操作,使复杂度为O(1)。next = head.next;主要搞清楚指针(链接)和实际值。 123456789101112131415161718192021222324p ... Read more »
链表——删除链表中间结点和a/b处的结点 Posted on 2018-08-29 | In Tech , Data Structures and Algorithms 题目1:给定链表头节点,实现删除链表中间节点的函数。1->2:删11->2->3:删2…若链表长度为N,则删除的节点为(N+1)/2。 实现:定位到要删除节点的前一个节点。方法一:只需要遍历一半。找规律:链表每增加2,要删除的节点就往后移一位 对于长度小于等于2的链表,单独考虑。 ... Read more »