
数据结构
snow_7
想当个花瓶的程序媛
展开
-
leetcode---21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:新链表是通过拼接给定的两个链表的所有节点组成的,这句话限制了我们不能新增一个链表来存储合并后的链表的节点,而是需要在比较的过程中不断调整两个链表的节点的指针指向最后把两个链表合并成一个链表。在遍历时当两个链表都还没有走到最后为空的位置,需要对两个链表当前.原创 2020-06-24 16:38:20 · 291 阅读 · 0 评论 -
leetcode---2. 两数相加
给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路:逆序存储,相加的时候也是逆序相加。这样加出来的新链表每...原创 2020-06-23 17:25:43 · 346 阅读 · 0 评论 -
leetcode---206. 反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路:反转链表,就是我们需要把链表的当前结点的下一个结点先保存起来。然后将当前结点的next指向它的前一个。然后再移动指向当前结点的和其前一个。/** * Definition for singly-linked list. * public class ListNode { * int..原创 2020-06-23 15:17:17 · 311 阅读 · 0 评论 -
leetcode---19.删除链表的倒数第N个节点
题目:给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n保证是有效的。思路:考察两个知识点,一是删除结点如果是删除的是都一个结点,那么得特殊处理处理。所以引入虚拟的头结点,让头指针指向头结点,题目要求返回链表的头结点其实就是返回链表的第一个结点。也就是引入的头结点的next二 快...原创 2020-06-23 14:40:22 · 226 阅读 · 0 评论 -
头结点的含义以及引入头结点的作用
一、概念头结点:是虚拟出来的一个节点,不保存数据。头结点的next指针指向链表中的第一个节点。对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息。头结点不是链表所必需的。头指针:是指向第一个结点的指针,如果链表没有引入头结点,那么头指针指向的是链表的第一个结点。头指针是链表所必需的。[注意]无论是否有头结点,头指针始终指向链表的第一个结点。如果有头结点,头指针就指向头结点。二、为何引入头结点1)对链表的删除、插入操作时,第一个结点的操作更方便如果链表没有头结点,那么头原创 2020-06-23 11:56:15 · 20799 阅读 · 7 评论 -
二叉树的层次遍历----java实现
根据层次遍历的顺序,每一层都是从左到右的遍历输出,借助于一个队列。先将根节点入队,当前节点是队头节点,将其出队并访问,如果当前节点的左节点不为空将左节点入队,如果当前节点的右节点不为空将其入队。所以出队顺序也是从左到右依次出队。代码:import java.util.LinkedList;public class LevelOrder{ public void levelIt原创 2016-07-03 16:44:19 · 28316 阅读 · 3 评论 -
二叉树的深度(递归和非递归)---java实现
递归实现为了求树的深度,可以先求其左子树的深度和右子树的深度,可以用递归实现,递归的出口就是节点为空。返回值为0;非递归实现利用层次遍历的算法,设置变量level记录当前节点所在的层数,设置变量last指向当前层的最后一个节点,当处理完当前层的最后一个节点,让level指向+1操作。设置变量cur记录当前层已经访问的节点的个数,当cur等于last时,表示该层访问结束。层次遍历在求...原创 2016-07-04 09:26:58 · 14550 阅读 · 2 评论 -
归并排序----java实现
归并排序归并排序是将两个有序的序列合并成一个新的有序序列。归并排序:(1)递归分解数组; 将数组每次折半划分,直到把数组划分为n个长度为1的有序序列。(2)合并排序数组;先做两两合并,得到2/n 个有序序列,再两两合并,不断重复这个过程,直到得到一个长度为n的数组。合并两个排序数组:(1)先依次比较两个数组中的元素,把较小的那个元素放在辅助数组的对应位置。(原创 2016-07-26 16:59:04 · 491 阅读 · 0 评论 -
剑指offer----矩形覆盖问题的解析与实现
问题:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解析:此类问题和青蛙跳台阶n个 每次可以跳一个台阶或者两个台阶 一共有多少次跳法 本质是一样的 当n=1,矩阵为2*1,只有横着覆盖1种方法 当n=2,矩阵为2*2,有横着覆盖和竖着覆盖2种方法 当n>=2时,设有F(n)种覆盖方法原创 2016-06-14 14:20:28 · 809 阅读 · 0 评论 -
剑指offer----青蛙跳台阶的解析与实现
(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?问题一分析:当n=1,有一种跳法 当n=2,一次跳一个跳两次,一次跳两个跳一次,共两种跳法 当n>=2时,n个台阶,设有F(n)种跳法原创 2016-06-14 13:08:04 · 4164 阅读 · 1 评论 -
剑指offer----斐波那契数列的实现--递归和迭代
1、定义斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,…这个数列从第三项开始,每一项都等于前两项之和。在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),2、递归实现 递归满足2个条件: 1)有反复执行的过程(调用自身)2)有跳出原创 2016-06-13 21:44:50 · 586 阅读 · 0 评论 -
队列----循环队列的实现
为了可以重新利用队列底层数组中已删除元素所占的空间,消除可能出现的“假满”现象,将顺序队列改进为循环队列。循环队列是首尾相连的队列:当front、rear变量达到底层数组的capacity-1之后,再向前以为就变成0.入队:(1)判断队列是否已满,已满抛出越界异常 (2)不满的话把元素查到队尾,并且rear+1,然后判断此时的rear是否已经等于capacity原创 2016-06-17 10:29:17 · 466 阅读 · 0 评论 -
链表---双向链表的解析与实现
(1)如果为每个节点保留两个引用prve和next,让prev指向当前节点的上一个节点,让next指向当前节点的下一个节点。此时链表既可以向前依次访问每个节点,也可以向后依次访问每个节点,这种形式的节点称为双向链表。(2)双向链表的查找 因为双向链表既可以向前搜索也可以向后搜索,当被搜索节点更靠近head或者tail中的某一端时,就从那一端开始搜索index从head开始搜索,in原创 2016-06-16 19:34:14 · 498 阅读 · 0 评论 -
栈---顺序栈的实现
一、(1)栈是在一种特殊的线性表,它代表只能在某一端进行插入、删除操作,通常在线性表的尾端进行插入、删除操作.(2)对于栈而言,通常允许插入、删除操作的一端被称为栈顶(top),另一端被称为栈底(buttom).(3)从栈顶压入元素称为进栈(push).(4)从栈顶删除元素称为出栈(pop).栈是一种先进后出的线性表.二、顺序栈的实现 顺序栈就是顺序储存结构的栈,它原创 2016-06-16 18:42:21 · 671 阅读 · 0 评论 -
线性表--顺序储存结构 java实现
1、线性表:由n(n>=0)个数据元素组成的有限序列。 对于一个非空、有限的线性表,总具有如下特征:(1)总存在唯一的第一个数据元素(2)总存在唯一的最后一个数据元素(3)除第一个数据元素外,集合中的每一个数据元素都只有一个前驱的数据元素(4)除最后一个数据元素外,集合中的每个数据元素都只有一个后继的数据元素顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的原创 2016-06-08 09:17:59 · 626 阅读 · 0 评论 -
选择排序----堆排序----java实现
(1)小顶堆 假设有n个元素的序列,k0-kn,如果将这组数据排成一棵完全二叉树,则此树的特点是:树中所有节点的值都小于其左右节点的值,此树的根必然是最小的;(2)大顶堆假设有n个元素的序列,k0-kn,如果将这组数据排成一棵完全二叉树,则此树的特点是:树中所有节点的值都大于其左右节点的值,此树的根必然是最大的;堆排序算法思想:大顶堆的根节点一定是这组数据中最大的数,如果原创 2016-07-11 15:26:10 · 445 阅读 · 1 评论 -
交换排序----冒泡排序----java实现
冒泡排序:第1趟:依次比较0和1、1和2.......n-2和n-1索引位置的元素,如果发现一个数比他后面的数大,则交换着两个数的位置,经过第一趟排序,最大的数排在了数组的最后面。第2趟:依次比较0和1、1和2.......n-3和n-2索引位置的元素,如果发现一个数比他后面的数大,则交换着两个数的位置,经过第2趟排序,0-n-2区间中最大的数排在了数组的倒数第二个位置。.......原创 2016-07-11 15:49:32 · 458 阅读 · 0 评论 -
选择排序----直接选择排序----java实现
思路:第一趟比较:程序将记录定位在数组的第一个位置,拿第一个数据与后面的每个数据对比,用一个变量mix记录比第一个数小的数据的索引,通过比较不断更新mix,最后得到整个数组中最小的元素的索引,将第一个数与第mix个数交换,则最小数位于数组的其实位置了,第二趟比较:程序将记录定位在数组的第二个位置,拿第二个数据与后面的每个数据对比,得到从第二个数据开始,数组中最小的数,并与第二个数交原创 2016-07-11 15:19:15 · 3331 阅读 · 1 评论 -
插入排序----直接插入排序----java实现
依次将待排序的数据元素按其关键字大小插入到前面的有序序列第1趟:将第2个元素插入到前面的有序序列中,此时前面就只有一个元素,是有序的;第2趟:将第3个元素插入到前面的有序序列;.......第n-1趟:将第n-1个元素插入到前面的有序序列。public void insertSort(int[] array) { if(array == null || array.l原创 2016-07-11 21:46:31 · 303 阅读 · 0 评论 -
二叉树的递归遍历----java实现
public class Iterator2{ //先序遍历 public void preIterator(BiTree root) { if(root != null) { System.out.print(root.val + "-->"); preIterator(root.left); preIterator(root.right);原创 2016-06-30 09:59:37 · 489 阅读 · 0 评论 -
二叉树的非递归遍历的解析与实现----java实现
先序遍历根据先序遍历的访问的顺序,先访问根节点,然后再访问左子树和右子树。对于树中的任意一个节点,都可以看做是一个根节点(也可以看成是一个树),因此可以直接访问根节点,访问完根节点,如果它的左子树不为空,用相同的方法访问它的左子树,直到左子树为空,再访问它的右子树。 对于树中的任意一个节点p:(1)访问p,并将节点入栈;(2)判断节点p的左孩子是否为空.若不为空,则将p的左孩子置为原创 2016-06-30 10:23:37 · 3231 阅读 · 0 评论 -
队列---顺序队列及其实现
1)系统采用一组地址连续的存储单元依次存放队列从rear端到front端的所有数据,程序只需要front和rear两个整型变量来记录队列front端的元素索引和rear端的元素索引。 (2)顺序队列的front总是保存着即将出队的元素的索引,顺序队列中的rear总是保存着下一个即将进入队列的元素的索引。 (3)队列中元素的个数是rear - front. (4)顺序队列的底层采用的是数原创 2016-06-16 18:29:04 · 588 阅读 · 0 评论 -
队列---链式队列及其实现
一、(1)采用链式储存结构的队列称为链队列。(2)队列采用front和rear分别指向队列的头、尾两个节点。(3)链式队列采用链式结构来保存队列中的所有元素,该队列允许添加无限多个元素,链式队列无队列满的问题。二、实现public class LinkQueue{ //定义节点类 private class Node { private T data;原创 2016-06-16 18:35:45 · 389 阅读 · 0 评论 -
栈---链式栈的实现
一、(1)栈是在一种特殊的线性表,它代表只能在某一端进行插入、删除操作,通常在线性表的尾端进行插入、删除操作.(2)对于栈而言,通常允许插入、删除操作的一端被称为栈顶(top),另一端被称为栈底(buttom).(3)从栈顶压入元素称为进栈(push).(4)从栈顶删除元素称为出栈(pop).栈是一种先进后出的线性表.二、可以采用单链表来保存栈中的所有元素,这种结构原创 2016-06-13 18:58:34 · 535 阅读 · 0 评论 -
单链表----java语言实现
节点 数据域:存放数据 指针域:存放下一个数据的地址1、常用操作 查找 插入 删除查找:(1)按照索引查找index位置上的节点:从头节点head开始依次向下找到第index位置的节点。(2)找到指定数据的索引位置:查找是否有节点中存放的数据与给定的数据相同,若有则返回节点的位置,没有返回-1.从头节点开始,一一对比。插入:(1)头插法:每次插原创 2016-06-07 15:43:44 · 4486 阅读 · 1 评论