精华内容
下载资源
问答
  • 链表的倒序打印

    2016-04-30 00:30:00
    问题描述:给定一个单链表的头结点,将链表逆序打印,并且要求不能改变链表的结构。 分析:考察对链表的理解,题目要求我们不能改变链表结构,但是链表是个单链表,只能向后指,不能向前指,这时我们可以采用其他...

    问题描述:给定一个单链表的头结点,将链表逆序打印,并且要求不能改变链表的结构。

    分析:考察对链表的理解,题目要求我们不能改变链表结构,但是链表是个单链表,只能向后指,不能向前指,这时我们可以采用其他数据结构来辅助,

    根据单链表性质,要从头开始访问,但是却要最先打印最后的节点,这是属于典型的先访问后输出的特点,因此可以用栈来辅助,将先访问到的节点依次

    入栈,入栈完后,开始出栈打印,可以符合题目要求。我们具体在编程时,可以采用栈结构,还可以使用递归,因为递归本质上是用栈来实现的。但是如果

    链表太长的话不适合用递归,因为递归开销过大。链表越长,递归层次越大。但是递归编程简单。因此具体使用栈还是递归要结合实际情况而决定各有利弊。

    因为此题比较简单,我就不再具体编程实现了,读者可以自己实现。

    转载于:https://www.cnblogs.com/guozhenqiang/p/5447935.html

    展开全文
  • 单链表倒序遍历

    2021-02-26 11:03:59
    方法一:先将单链表进行反转操作,然后再遍历即可,这样做的问题是会破话原来的单链表的结构,不建议。 方法二:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的...

    在这里插入图片描述
    上图要求倒序打印单链表。

    思路:

    • 方法一:先将单链表进行反转操作,然后再遍历即可,这样做的问题是会破话原来的单链表的结构,不建议。
    • 方法二:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果。
    //使用栈逆序打印单链表
        public static void reversePrint(HeroNode head){
            if(head.next == null){
                return;//空链表
            }
    
            //创建一个栈,将各个节点压入栈中
            Stack<HeroNode> stack = new Stack<HeroNode>();
            HeroNode cur = head.next;
            //将链表的所有节点压入栈
            while (cur!=null){
                stack.push(cur);
                cur = cur.next;
            }
    
            //将栈中的节点进行打印
            while (stack.size()>0){
                System.out.println(stack.pop());
            }
    
        }
    

    在这里插入图片描述

    展开全文
  • 那这个需求在技术维度来说,有什么特点吗?先想10秒钟,在接着往下看!!!有什么设计要点呢?用户访客记录一定要缓存,要不然怎么抗住大并发呢?由于最新访客记录变化非常快,要有一种能快速添加新数据,删除...
    8eebc578668e4ba4cf6769559784dd72.png

    准备加班中ing.....

    需求要点

    每个用户都有自己的个人空间,当有其他用户来访问的时候,需要添加访客记录,并且更新为最新的访客,这里设计到一个坑,如果存在这个用户的访问记录需要更新用户的最后访问时间。那这个需求在技术维度来说,有什么特点吗?

    先想10秒钟,在接着往下看!!!

    有什么设计要点呢?

    1. 用户的访客记录一定要缓存,要不然怎么抗住大并发呢?
    2. 由于最新的访客记录变化非常快,要有一种能快速添加新数据,删除老数据的数据结构。

    缓存的篇章今日暂且不说,说一下以上的第二点,也就引出了今日数据结构主角:链表

    链表百科:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表属于线性结构。

    链表分类

    • 单链表:链表中的元素的指向只能指向链表中的下一个元素或者为空,元素之间不能相互指向。也就是一种线性链表。
    8279a9dbe5631d3d1781bafd0b0a726f.png

    public class Node

    {

    //当前节点的数据元素

    public T Data { get; set; }

    //当前节点的下一个元素

    public Node NextNode { get; set; }

    }

    • 双向链表:每个链表元素既有指向下一个元素的指针,又有指向前一个元素的指针,其中每个结点都有两种指针。
    e16c35e267bf7836f315345f7804f296.png

    public class Node

    {

    //当前节点的前一个节点

    public Node PreNode { get; set; }

    //当前节点的数据元素

    public T Data { get; set; }

    //当前节点的下一个元素

    public Node NextNode { get; set; }

    }

    • 循环链表:指的是在单向链表和双向链表的基础上,将两种链表的最后一个结点指向第一个结点从而实现循环。
    25678e83672f7f9cf8fe055f0ddfa5f5.png
    03361eabe0e9c38de06645f58afdd891.png

    特性

    1. 元素的数量可以随时扩充。由于链表在物理的存储单元上是非连续的,这就早就了它天生的优势,我的节点可以在任意符合要求的地方分配内存。

    2. 添加元素:

    单链表:当在一个位置N之后插入新元素的时候,单链表首先把当前位置N的元素的Next指针指向新的元素,然后新的元素的Next指针指向N+1位置的元素。当然如果是在首位置插入新元素,只需要把新元素的Next指针指向链表的首元素即可,同理,如果要在单链表尾部插入新元素,只需要把单链表的尾部元素的Next指针指向新元素。至于循环单链表,无所谓首元素和尾元素之分。

    ee47ed6cbebed2b7f3ef4d401af45a0d.png

    双向链表:

    在位置N之后添加新元素和单链表原理类似,原理也是修改元素的指针指向。但是这里有一个不同,双向链表要修改前后元素(N位置和N+1位置)和新元素三个Node的指针,所以略微麻烦一点。

    f744e8e96ae164758bf088152fa14703.png

    3. 删除元素:

    单链表:当要删除位置N的元素的时候,只需要把N-1位置元素的Next指针指向N+1即可。

    59e5ccbf71e044ef9de0ca5f9ef95599.png

    双向链表:当要删除位置N的元素的时候,需要修改N-1位置元素的Next指针指向N+1元素,同时还要修改N+1位置元素的Pre指针指向N-1元素。

    9b8e90acdb0c908940fd277987af5112.png

    4. 查找元素:

    由于链表的元素在内存中并非连续,所以不能像数组那样拥有O(1)的查找时间复杂度,只能是通过首元素去遍历链表,所以时间复杂度为O(n)

    程序设计

    给你10秒回到X总的需求中来。通过对链表的介绍,我们该选择哪种链表呢?这里我先说一下我的思路,如有错误请指正:

    1. 当一个访客进入个人空间的首页时,大多数情况下,访客记录只需要缓存前100条或者200条即可,也就是说这个场景是存在热点数据的,80%(甚至更高)的请求命中在最近100条访客数据上,很少人会去查看很久以前的记录。所以基于占用内存空间上的考虑,我决定缓存最近的100条访客数据。

    2. 假设我用链表缓存了前100条数据,其中在非首位置有一条访客A的记录,此时A又访问的这个用户空间,我需要把A的记录移到首位置,这个过程经历了删除A数据,在首位置添加A数据。假如A开始的位置是N,我在删除N位置数据的时候,需要查找N-1的位置元素修改其指针指向,如果是单链表由于当前位置N的元素中没有N-1位置元素的信息,所有需要重新遍历链表。如果是双向链表呢,位置N的元素中保存了位置N-1的元素,所以没有必要在重新遍历链表了,这也是双向链表对比单链表的优势,虽然内存占用上多了一个指针的内存大小,但是在实际的应用场景中更为常用。所以我选择双向链表。删除操作和添加操作时间复杂度都是O(1).

    3. 对同一个空间的访问,必然存在锁和多线程的问题。所以我在选择框架的时候优先选择了基于Actor模型的框架。避免了在同一个用户空间上加锁的操作。

    4. 由于基于Actor模型的框架,所以我没有采用类似Redis这样的进程外缓存,而是采用了进程内缓存,毕竟网络传输的速度再快也比内存操作要慢的多。应用层的Actor服务天然支持分布式。如果对actor 不太了解的同学可以度娘一下。

    优化

    1. 阅读到这里你是否感觉哪里有问题呢?是的,就是链表元素的查找,由于只能是遍历,所有链表查找元素的时间复杂度为O(n),那有没有办法优化呢?那就是我们以后要讲的另外一种数据结构了。

    2. 空间的访客记录是以时间为维度的倒序排列,所以业务以及DB时间列的设计类型推荐为UTC时间戳long类型,毕竟long类型在多数语言中比datetime类型占用内存要小很多。

    3. 无论是否使用缓存,用户的访问记录都是需要DB来持久化的,当有大量的请求的时候,我们可以利用某种机制来批量持久化到DB,而不是一个请求就访问数据库一次。

    4. 当对空间的访客记录实时性要求不是很高的时候,我们可以每10秒或者5秒更新缓存,也就是批量更新缓存,这比单条加锁更新缓存效果更好。

    X总的个人空间需求并没有结束,菜菜仍然在持续优化中,欢迎大佬指正!

    欢迎关注:架构师修行之路,收货更多精彩内容

    展开全文
  • 在main函数中,入栈顺序是’a’、‘b’、‘c’,而出栈打印顺序却是’c’、‘b’、‘a’,最后入栈’c’最早出来,因此堆栈这种数据结构的特点可以概括为LIFO(Last In First Out,后进先出)。我们也可以写一...

    在main函数中,入栈的顺序是’a’、‘b’、‘c’,而出栈打印的顺序却是’c’、‘b’、‘a’,最后入栈的’c’最早出来,因此堆栈这种数据结构的特点可以概括为LIFO(Last In First Out,后进先出)。我们也可以写一个递归函数来倒序打印,这是利用函数调用的栈帧实现后进先出的:
    在这里插入图片描述

    也许你会说,又是堆栈又是递归的,倒序打印一个数组犯得着这么大动干戈吗?写一个简单的循环不就行了:
    #include <stdio.h>
    #define LEN 3

    char buf[LEN]={‘a’, ‘b’, ‘c’};

    void print_backward(int pos)
    {
    if(pos == LEN)
    return;
    print_backward(pos+1);
    putchar(buf[pos]);
    }

    int main(void)
    {
    print_backward(0);
    putchar(’\n’);

     return 0;
    

    }

    展开全文
  • 文章目录栈概念栈的特点操作Python 实现栈栈简单应用:括号匹配问题栈简单应用:倒序输出一组元素 栈概念 栈(stack)又名堆栈,栈是一种线性数据结构,用先进后出或者是后进先出方式存储数据,栈中...
  • 因为栈的结构特点,存储在栈内部的元素出栈是倒序的,所以的借助外部空间去现将栈内的元素吐出来在输出才能得到应有的顺序。 所以可以借助一个新栈,将原来栈内部的元素一个一个吐出来,这个时候新栈内部保存的数据...
  • 线性表特点和用法总结

    千次阅读 2012-05-01 14:03:27
    刘老师说过:学习任何一个知识点,最重要不是把它记住,而是明白它有什么用!!! 1、顺序表 特点:直接存取方便,插入删除开销大。...用处:有倒序扫描链表需求时 4、循环链表?? 特点:最后单元反过
  • 的特点就是先进后出,队列的特点就是先进先出。栈一个重要应用场景就是倒序某一个东西,例如字符串等等。 1.使用数组结构实现固定长度栈:思路比较简单,可以在内部维护一个索引值,通过这个索引值与长度...
  • 1.列表(List) 列表的特点 1. 数据按顺序存储 2. 列表有正序、倒序两种索引 3. 列表可存储任意类型的数据,并且允许重复。 列表的遍历: ...像上述的结构无法解析2000-4-24到底是什么含义,21000也不明确
  • 抓住头插的特点! 头插就是倒序!! 所以逆转就是将原链表所有元素重新做一遍头插,形成新链表 1.如果链表为空表,抛出异常 2.设置三个辅助变量p(指向链表头结点,头指针,初值为list.first),q(指向p后...
  • 由于进制转换中转换过程中存在取余倒序很好契合栈"先进后出"的特点,故使用栈存储结构进行实现 一.栈定义 ★栈(stack):只能在一端插入和删除线性表,又称为“先进后出”线性表,或“后进先出”线性表...
  • 数据结构 一、 1.一个中缀中缀表达式转为后缀表达式 2.五个权值不同的元素,能构成多少种哈弗曼树 ...6.一倒序的序列,冒泡排序和归并排序的时间复杂度 7.ABCD依次入栈,C入栈时候才允许出栈...
  • 大话数据结构

    2019-01-10 16:35:22
    双向链表既然是比单链表多了如可以反向遍历查找等数据结构,那么也就需要付出一些小代价。 3.15总结回顾 84 3.16结尾语 85 如果你觉得上学读书是受罪,假设你可以活到80岁,其实你最多也就吃了20年苦。用人生...
  • 大话数据结构 程杰

    2018-09-01 10:06:43
    双向链表既然是比单链表多了如可以反向遍历查找等数据结构,那么也就需要付出一些小代价。 3.15总结回顾 84 3.16结尾语 85 如果你觉得上学读书是受罪,假设你可以活到80岁,其实你最多也就吃了20年苦。用人生...
  • 可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统栈,以及在链表倒序输出时介绍自定义栈类Stack和使用系统栈进行递归。那么,在这里我们就讲述一下这两个比较具有特色或者说关系比较紧密数据...
  • 通篇以一种趣味方式来叙述,大量引用了各种各样生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到一些经典算法做到逐行分析、多算法比较。与市场上同类数据结构图书相比,本书内容趣味易...
  • 大话数据结构-程杰

    2014-07-13 23:45:52
    双向链表既然是比单链表多了如可以反向遍历查找等数据结构,那么也就需要付出一些小代价。 3.15 总结回顾 84 3.16 结尾语 85 如果你觉得上学读书是受罪,假设你可以活到80岁,其实你最多也就吃了20年苦。用...
  • 通篇以一种趣味方式来叙述,大量引用了各种各样生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到一些经典算法做到逐行分析、多算法比较。与市场上同类数据结构图书相比,本书内容趣味易...
  • 6.5.1 二叉树特点 164 6.5.2 特殊二叉树 166 6.6 二叉树性质 169 6.6.1 二叉树性质1 169 6.6.2 二叉树性质2 169 6.6.3 二叉树性质3 169 6.6.4 二叉树性质4 170 6.6.5 二叉树性质5 171 6.7 二叉树存储结构 172 ...
  • 1,2,3,4,5列火车进站出站,有哪些组合方式?对于进出站的方式与数据结构中的栈...由于进栈的顺序是由小到大的,所以出栈序列应该满足以下条件:对于序列中的任何一个数其后面所有比它小的数应该是倒序的。据此,本题可
  • 数据结构:从计算机存储 组织数据的结构 列表(List) 元组(Tuple) 字典(Dictionary) 集合(Set) 一,列表(List): 1,基本 特点: a,列表中的数据按顺序排列 b,列表有正序与倒序两种索引 c,列表可存储任意...
  • 简历可以分为基本信息、项目经历、自我总结等部分,各个部分要做到主次分明,特别是项目介绍,建议按照发生时间倒序来排列,最新项目放在最前。 多个项目之间也要分主次。重点项目、最能体现你能力和工作成果...
  • 五、列表与字典

    2019-11-21 00:12:27
    数据结构就是指计算机存储、组织数据的结构 Python中主要有四种数据结构 列表(list) 元组(Tuple) 字典(Dictionary) 集合(Set) 二、列表 1.列表的特点 列表中的数据按顺序排序,可以通过索引取值 列表有正序与...
  • 从尾到头打印链表

    2021-02-08 23:49:18
    题解:倒序的问题用栈这种数据结构正好解决,栈的特点是先进后出,首先遍历整个链表,将链表中的元素从表头挨个压入到栈中,链表头的元素在栈底,链表尾的元素在栈顶,最后只需从栈中挨个弹出元素放到List中就完成了...
  • 双链表

    2019-06-25 18:31:19
    比起单链表,节点多了一个指向前一个节点指针,弥补了单链表节点不能找到前面一个节点缺陷,并且需要链表倒序时,可以从尾部开始遍历,查找元素时,可以从较近一方开始遍历,因为节点多了一个属性,所有所用...
  • PHP中list()

    2013-10-08 20:03:58
    1、赋值顺序是倒序的。也就是说从右到左的顺序进行赋值。这一点特别是在使用把数组的值赋给另一个数组时要特别注意。 如:list(a[1], a[2], a[3]) = array('1','2','3').结果得到的数组是array(3=>'3', 2=>'
  • 此题总结: 求解 最大爆破值, 是一个 倒序 二分法问题,最终原子结构是连续三个数。连续三个数,可以 往上递推 间隔一个数三个数,间隔n个数三个数特点在于:每一次递推,都有可能改变当前槽位值,因为...
  • 栈和队列虽然是特点针锋相对两个数据结构,但他们之间亦有密切联系,比如“用两个栈实现队列”,“用两个队列实现栈”。 栈相关面试算法 利用栈特性先进后出(FILO)去解决问题,主要用以下特性: 数据是线性...
  • List 与 explode

    千次阅读 2010-11-01 22:27:00
    list的几个特点: 1、赋值顺序是倒序的。也就是说从右到左的顺序进行赋值。这一点特别是在使用把数组的值赋给另一个数组时要特别注意。 如:list(a[1], a[2], a[3]) = array('1','2','3').结果得到...
  • 程序实现是在客户端对表格进行排序,有以下特点: 1.自定义排序列、排序属性(例如innerHTML)、排序数据类型(包括int、float、date、string)、排序顺序(顺序和倒序); 2.自定义排序函数; 3.可同时设置...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

倒序的结构特点