数据结构与算法
sinceNow
北葵向暖,南栀倾寒。
展开
-
八种经典排序算法(python实现)
八种经典排序算法(python实现)算法概述 冒泡排序 插入排序 选择排序 快速排序 希尔排序 归并排序 计数排序 桶排序0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以...原创 2019-05-08 10:53:59 · 871 阅读 · 3 评论 -
python链表 —— 把链表相邻元素翻转
题目描述:把链表相邻的结点看成一组进行翻转。假设给定链表1—>2—>3—>4—>5—>6—>7—>8,那么翻转后的链表变为2—>1—>4 —> 3 —> 6 — >5 — >7。算法思想:就地逆序通过调整指针域的指向直接调换响铃的两个节点。如果单链表恰好有偶数个节点,那么只需要将就节点对调即可,如果链表有基数...原创 2019-08-23 14:25:31 · 677 阅读 · 0 评论 -
python链表 —— 单向循环链表的增、删、查
单链表是一个变形的单向循环链表,链表中最后的一个节点的next域不再为None,而是指向链表的头结点单向循环链表的增、删、查实现class Node(object): def __init__(self, item): self.item = item self.next = Noneclass SinCyLinkList(object):...原创 2019-08-09 11:20:54 · 258 阅读 · 0 评论 -
python链表 —— 检测一个较大的单链表是否有环
题目描述单链表有环是指单链表中某个节点的next域指向的是链表中在它之前的某一个节点,这样在链表尾部形成一个环形结构,如何半段一个链表是否有环思路使用两个指针,初始时两个指针均指向链表头位置,然后一个指针每次走两步,一个指针每次走一步,如果在循环过程中遇到两个指针相等,则说明有循环返回true。如果出现一个指针无法继续往下走,则退出循环返回false。因为fast先进入环,在slo...原创 2019-08-09 08:56:40 · 230 阅读 · 0 评论 -
python链表 —— 对链表进行重新排序
题目描述:给定链表L0 —> L1 —> L2 .....Ln-1 —> Ln,把链表重新排序为L0 —> Ln —> L1 —> Ln-1 —>L2 —> Ln-2......要求:(1)在原来链表的基础上进行排序,即不能申请新的节点(2)只能修改节点的next域,不能修改数据域解题思路分析:(1)首先找到链表的中间节点...原创 2019-08-13 16:20:04 · 1270 阅读 · 0 评论 -
python实现—— 判断字符串s2的任意排列是否是字符串s1的字串
题目描述:有两个字符串s1、s2,判断s1的字串是否第s2的任意排列第一种方法:切割字符串算法思想:将字符串s1切割成和s2一样长的字符串,判断切割后的这个字符串的元素和s2的是否一样,如果每个元素都一样,则判断截断的字符串排序之后和s2是否一样,若一样,即存在s1的字串是s2的其中一个排列代码实现:s1 = input()s2 = input()len_s1 = l...原创 2019-08-13 16:10:59 · 3627 阅读 · 0 评论 -
python中的多行输入
方法1:利用异常处理机制实现lines=[]while True: try: lines.append(input()) except: break方法二:利用标准输入文件对象sys.stdin的readlines()函数实现因为键盘是标准输入设备,计算机操作系统将键盘也是当做文件来对待的,其实计算机操作系统将包括键盘显示器鼠标打...原创 2019-08-13 15:59:28 · 16400 阅读 · 1 评论 -
python链表 —— 找出单链表中的倒数第K个元素
题目描述:找出单链表中的倒数第K个元素算法描述从头到尾遍历链表,在查找的过程中,设置两个指针,让其中的一个指针比另一个指针先向前移动K步,然后两个指针同时向前移动代码实现第二种方法:class LNode: def __init__(self, item): self.data = item self.next = None#创建一...原创 2019-08-08 16:28:49 · 470 阅读 · 0 评论 -
python链表 —— 如何从无序链表中移除重复项
方法一: 顺序删除算法思想:通过双层循环直接在链表上删除。外层循环用一个指针从第一个节点开始遍历整个链表,然后内层循环用另一个指针遍历其余节点与外层循环指针所指的节点的数据进行对比,若是相同则删除性能分析:该算法的时间复杂度为o(n*2),空间复杂度为o(n)#方法一:顺序删除class LNode(object): def __init__(self, item)...原创 2019-08-02 09:53:16 · 676 阅读 · 0 评论 -
python链表 —— 如何计算两个单链表所代表的数之和
题目描述:给定两个单向链表,链表的每个节点代表一位数,计算两个数的和方法分析:方法一: 整数相加分别遍历两个链表所代表的值,然后将两个整数加到一起方法二:链表相加法对链表中的节点直接进行相加操作,把相加的和存储到新的链表中对应的节点中,同时还要记录节点相加后的进位。算法性能分析:这种方法需要对两个链表遍历,因此时间复杂度为o(N),由于计算结果保存在一个新的链表中...原创 2019-08-08 11:28:43 · 605 阅读 · 0 评论 -
python链表 —— 有头结点和没有头结点的区别
不论是带头结点的链表还是不带头结点的链表,头指针head都指向链表中的第一个结点。如果该链表有头结点,则头指针head指向头结点,如果没有头结点,则头指针head指向链表的第一个节点。1 带头结点的单链表中头指针head指向头结点,头结点的值域不含任何信息,从头结点的后继结点开始存储信息。头指针head始终不等于NULL,head->next等于NULL的时候链表为空。2 不带头结点...原创 2019-08-08 11:21:01 · 3147 阅读 · 0 评论 -
python链表 —— 单向链表逆序
如何实现链表的逆序方法一:就地逆序算法思想:在遍历链表的时候,修改当前节点的指针域的指向,让它指向它的前驱节点。因此,需要一个指针来保存它的前驱,此外,为了调整当前节点的指针域的指向后还能找到后继结点,还需要另外一个指针变量保存后继结点,在所有的节点都被保存好以后,就可以直接完成逆序了算法性能分析:这种方法对链表遍历一次,时间复杂度为o(N),N为链表的长度。但是需要常数个变量...原创 2019-08-01 21:48:00 · 556 阅读 · 0 评论 -
python 链表——单向链表的增、删、改、查
单向链表单向链表的节点实现class SingleNode(object): """单链表的节点""" def __init__(self, item): self.item = item self.next = None单链表的操作is_empty() #链表是否为空length() # 链表长度trave...原创 2019-08-01 21:18:08 · 604 阅读 · 0 评论 -
二叉树的经典面试问题
二叉树面试问题1:计算一共有多少个节点。'''算法思想:运用递归的思想,迭代计算出节点的个数。 遍历二叉树,分别计算左子树和右子树的节点个数,依次递归,最后返回左子树和右子树的总数和+1'''代码实现:class Node(object): '''节点类''' def __init__(self, elem, lch...原创 2019-05-20 21:14:33 · 653 阅读 · 0 评论 -
二叉树的重构(Python实现)
二叉树的重构1. 概念二叉树的重构是指通过二叉树的遍历结果得到二叉树的构造。重构方案:前序遍历(PreOrder)+中序遍历(InOrder) 后序遍历(PostOrder) + 中序遍历(InOrder) 前序遍历(PreOrder) ...原创 2019-05-11 09:52:17 · 858 阅读 · 0 评论 -
四种经典查找算法(python实现)
四种经典排序算法(python实现)顺序查找 二分查找 差值查找 二叉树查找一、顺序查找'''顺序查找:1.算法思想:顺序查找,对于一个无序序列,遍历数组中的所有元素,对比每一个元素是否和要查询元素相等2.时间复杂度:o(n)3.空间复杂度:o(1)'''代码实现:def sequential_search(li, key):...原创 2019-05-20 21:07:46 · 612 阅读 · 1 评论 -
二叉树的构建于遍历(python实现)
二叉树的构建与遍历二叉树的基本概念 二叉树的性质 特殊的二叉树 二叉树的节点以及树的构建 二叉树的遍历1. 二叉树的基本概念二叉树是每个节点最多有两个子树的树结构。通常子树被称为‘左子树’和‘右子树’。2. 二叉树的性质性质1:在二叉树的第i层上至多有个节点性质2:深度为k的二叉树至多有个节点性质3:对于任意一颗二叉树,如果叶子节点为n0,而度数为2...原创 2019-05-11 09:51:05 · 361 阅读 · 0 评论 -
python实现贪婪算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。通俗一点讲,当要解决某一个问题时,先判断第一步的最优解,然后把剩下的步骤看作下一个递归的具体问题。代码实现:if __name__ == "__main__": beg = 50 value = 0 choice =...原创 2019-08-10 11:18:36 · 1173 阅读 · 0 评论