
Java版数据结构
文章平均质量分 71
小矮多
这个作者很懒,什么都没留下…
展开
-
7种基于比较的排序算法
从小到大排序package sort;import java.util.Stack;import java.util.concurrent.ForkJoinPool;public class SortDemo { private void swap(int[] array, int x, int y) { int temp = array[x]; array[x] = array[y]; array[y] = temp; }原创 2020-07-30 14:38:53 · 649 阅读 · 0 评论 -
最小栈
问题:用两个栈实现最小栈思路:一个栈作为普通栈,一个栈作为最小栈,一个元素入普通栈,如果最小栈为空,这个元素也入最小栈,如果最小栈不为空,比较这个元素和最小栈栈顶的元素大小,如果小于则入最小栈,否则不入。出栈时,比较出栈元素和最小栈栈顶元素是否相等,如果相等则出最小栈,如果不相等,则不出最小栈。代码:import java.util.Stack;class MinStack{ private Stack<Integer> stack; private Stack<原创 2020-07-17 19:29:55 · 141 阅读 · 0 评论 -
利用栈模拟队列和利用队列模拟栈
问题1:使用2个栈模拟队列思路:入栈到stack1。出栈时判断stack2是否有元素,如果没有,判断stack1是否有元素,如果没有队列为空,如果stack1有元素,将stack1中元素出栈,再入栈到stack2,如果stack2有元素,直接出栈。代码:import java.util.Stack;class MyQueue{ private Stack<Integer> stack1; private Stack<Integer> stack2;原创 2020-07-17 19:16:03 · 255 阅读 · 0 评论 -
左右括号匹配问题
问题:一个字符串只包括‘(’、‘{’、‘[’、‘)’、‘}’、‘]'问括号是否能匹配上,能返回true,不能返回false.分析:分情况①左括号多 false;②右括号多 false;③左右括号不匹配 false④左右括号匹配 true代码: //左右括号匹配问题 // 利用栈 public static boolean isValid(String s) { Stack<Character> stack=new Stack<>原创 2020-07-17 18:08:03 · 793 阅读 · 0 评论 -
循环队列
class CircleQueue{ public int elem[]; public int front; public int rear; public CircleQueue(int x){ elem=new int[x]; } public boolean offer(int x){ if(full()){ return false; } elem[rear]=x原创 2020-07-17 17:14:24 · 114 阅读 · 0 评论 -
实现数组栈和链式队列
用数组实现栈:import java.util.Arrays;class MyStack{ public int elem[]; public int top; public int size; public MyStack() { elem = new int[10]; } public void push(int x) { if (full()) {//扩容 elem = Arrays.co原创 2020-07-17 16:43:23 · 109 阅读 · 0 评论 -
单链表练习题:合并两个有序链表(升序)
思路:定义一个新的结点newHead,从头开始比较两个链表的节点的值域,值小的串到newHead后面。代码:public Node mergeList(Node headA,Node headB){Node newHead=new Node(-1);Node temp=newHead;while(headA!=null && headB!=null){if(headA.data<headB.data){temp.next=headA;temp=temp.next;h原创 2020-07-11 19:55:15 · 630 阅读 · 0 评论 -
单链表练习题:判断两个链表是否相交,如果相交返回相交的节点,否则返回null
题目:判断两个链表是否相交,如果相交返回相交的节点,否则返回null。思路:代码:public Node getIntersectionNode(Node headA,Node headB){Node p1=headA;Node p2=headB;int lenA=0;int lenB=0;while(p1!=null){lenA++;p1=p1.next;}while(p2!=null){lenB++;p2=p2.next;}p1=headA;p2=headB;int原创 2020-07-10 09:22:25 · 240 阅读 · 0 评论 -
单链表练习题:判断链表是否有环
题目:判断链表是否有环,如果有返回成环的节点,没有返回null思路:代码:public Node detectCycle(){Node fast=head;Node slow=head;while(fast!=null && fast.next!=null){//判断是否成环if(fast==slow){break;}fast=fast.next.next;slow=slow.next;}if(fast==null||fast.next==null){ret原创 2020-07-10 08:52:43 · 308 阅读 · 0 评论 -
单链表练习题:判断链表是不是回文链表
思路:找到链表的中间节点,然后逆置后半段,再从两边比较对应位置是否值域相等。代码:public boolean chkPalindrome(){if(head==null){return false;}if(head.next==null){return true;}Node fast=head;Node cur=head;//找到中间节点while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=s原创 2020-07-09 21:22:00 · 314 阅读 · 0 评论 -
单链表练习题:给定一个数据,比该数据小的都放到前面,比该数据大的都放到后面,原节点之间的前后顺序不变
题目:给定一个数据,比该数据小的都放到前面,比该数据大的都放到后面,原节点之间的前后顺序不变。思路:定义两段bs—be和as—ae,如果当前节点的值域小于这个数据就放到bs—be段,如果大于就放到as—ae段,最后把两段连起来。代码:public Node partition(int n){if(head==null){return null;}Node cur=head;Node bs=null;Node be=null;Node as=null;Node ae=null;wh原创 2020-07-09 20:27:26 · 448 阅读 · 0 评论 -
单链表练习题:求倒数第k个节点(只允许遍历一次链表)
思路:定义两个变量fast和slow,fast先走k-1步,然后一起走,当fast.next==null时,slow指向倒数第k个节点。代码:public Node findKTH(int k){if(head==null){return null;}if(k<1){throw new RuntimeException("位置错误");}Node fast=head;Node slow=head;for(int i=0;i<k-1;i++){if(fast.next!=原创 2020-07-09 19:55:57 · 294 阅读 · 0 评论 -
单链表练习题:求单链表的中间节点(只允许遍历一次链表)
思路:使用两个变量fast和slow,从head开始一起往后走,fast一次走2步slow一次走一步,当fast走到最后一个节点或者走到null时,slow走到中间。代码:public Node findMiddleNode(){Node fast=head;Node slow=head;while(fast!=null&&fast.next==null){//上面这两个条件不能交换,否则fast如果为null,fast.next会出错fast=fast.next.next;原创 2020-07-09 17:32:30 · 556 阅读 · 0 评论 -
单链表练习题:反转单链表
方法一:思路:定义三个变量(prev cur curNext)的逆置过程代码:public Node reverseList(){Node cur=head;Node prev=null;Node newHead=null;while(cur!=null){Node curNext=cur.next;if(curNext==null){newHead=cur;}cur.next=prev;prev=cur;cur=curNext;}return newHead;}方原创 2020-07-08 21:16:03 · 237 阅读 · 0 评论 -
实现无头节点的单链表
class Node{public int data;public Node next;public Node(int data){this.data=data;}}public class MyLinkedList{public Node head;public void addFirst(int data){Node node=new node(data);//判断是否是空链表if(this.head==null){this.head=node;}else{node.原创 2020-07-08 19:41:43 · 366 阅读 · 0 评论 -
什么是哈希表?如何解决哈希冲突?
1.什么是哈希表?哈希表(hash table) 又叫散列表,是一种数据结构.它的存储形式为:每一个按序进入的数据经过哈希函数得到一个索引值,将数据存到哈希表中该索引对应的位置.哈希表的优点:由于能够像数组一样按下标访问数据,所以查找的时间复杂度为O(1).2.什么是哈希冲突?由于不同的数据经过哈希函数得到的索引值可能相同,而索引对应哈希表中的唯一位置,将这种冲突叫做哈希冲突.3.如何...原创 2020-03-17 22:27:30 · 1340 阅读 · 0 评论 -
什么是红黑树?
要了解红黑树,首先要了解二叉查找树1.二叉查找树的特点:左子树上所有结点值均小于等于根节点;右子树上所有结点值均大于等于根节点;左右子树都是一棵二叉排序树.这种数据结构的好处是每次查找的次数最多是二叉查找树的高度.在插入结点时,也是按照二叉树特点进行插入的,但是在插入的时候会遇到如下图的问题:近乎线性的结构,降低了查找的性能.为了解决这个问题,红黑树应运而生!2.红黑树的五...原创 2020-03-17 21:01:07 · 237 阅读 · 0 评论 -
泛型类和哈希表
关于泛型:1.类型:泛型类/泛型方法2.泛型:一定要区分是泛型的定义还是使用3.把握E…是一个类型变量,有其作用域类名称后面的是定义类型变量,其余位置都是使用4.谁是谁的父类的问题**(重要)**List不是List的父类List<?>是List的父类5.泛型是编译期间的工作,运行期间会进行类型擦除Hash HashMap/HashSet实现搜索的数据结构1....原创 2019-10-13 20:54:40 · 263 阅读 · 0 评论 -
数据结构—二叉树
二叉树:叶子/根/高度链式表示法:利用树的节点表示二叉树,类似链表class Node {int val;Node left;//左孩子,左子树的根Node right;//右孩子,右子树的根特殊二叉树:完全二叉树/满二叉树遍历方式:1.深度优先遍历前 中 后序练习:1.前中后序遍历//前:根+左子树+右子树//中:左子树+根+右子树//后:左子树+右子...原创 2019-09-18 17:23:46 · 237 阅读 · 0 评论 -
数据结构—快速排序
快速排序:总览过程:**在排序区间中选择一个基准值遍历整个待排序区间,将比基准值小的放在左边,大的放在右边分治思想(partition) 对左右的小区间分别用同样的方法处理,直到区间长度为1(有序)或0(没有数)如何做partition数组,奇数在左,偶数在右**hoare1.两边往中间靠4. 挖坑5. 3. Partition之前后下标 一边靠 注意:part...原创 2019-09-26 23:55:58 · 204 阅读 · 0 评论 -
数据结构—堆
一.堆的概念:堆逻辑上是一颗完全二叉树,采用层次遍历的方式,物理上存储在数组中。满足任意结点的值都大于其子树中结点的值,叫大堆,反之叫小堆。二.下标关系:1.已知双亲的下标,则:left=2parent+1;right=2parent+2;2.已知孩子下标,则:parent=(child-1)/2 //向下取整三.向下调整前提:左右子树必须已经是一个堆,才能调整。...原创 2019-09-27 00:39:24 · 121 阅读 · 0 评论 -
数据结构—插入排序、希尔排序、直接选择排序、堆排序、冒泡排序
数据结构-排序原创 2019-09-27 17:07:22 · 226 阅读 · 0 评论 -
搜索树
搜索树搜索:两种模型:1.纯Key模型 “看篮子里有没有苹果,没有就可以放一个苹果”2.Key-Value模型 “通过姓名查找电话,姓名不重复电话可重复”搜索的结构:1.搜索树2.哈希表3.跳表(了解)Java中:Map和Set搜索-专题搜索树:特殊的树(二叉搜索树)纯Key模型搜索树的中序遍历是有序的(重要)1.查找/搜索2.插入3.删除在搜索结构中,Key...原创 2019-10-09 18:33:31 · 138 阅读 · 0 评论 -
Java数据结构——顺序表和单链表
前言:学习算法,不论对思考问题的方式还是对编程的思维都会有很大的好处。而数据结构在算法的这个概念里是非常重要的,学好了数据结构就能写出更好的代码,所以必须花费精力和时间去好好学习。要想学好数据结构就必须先掌握好基础。本节对数据结构里的两种基本的线性表(顺序表和单链表)的基本内容进行了详细的描述,理解并且熟练运用这些很重要。正文:首先来说什么是时间复杂度和空间复杂度?复杂度:粗鲁衡量算法...原创 2019-07-24 17:43:31 · 544 阅读 · 0 评论