有意思的链表的题

题1:给出一个单链表,不知道节点个数,怎么只遍历一次就可以求出中间节点,写出算法?

解析:设两个指针,比如*p,*q。p每次移动两个位置,即p=p->next->next,q每次移动一个位置,即q=q->next

            当p到达最后一个节点时,q就是中间节点

代码:略


题2:已知n个人(以编号1,2,3...n分别编号)围坐在一张圆桌周围。从编号为k的人开始报数,数到m,的那个人出列;他的下一个人又从k开始报数,数到m的那个人有出列;依次规律重复下去,知道圆桌周围的人全部出列。编程实现。

解析:本题就是约瑟夫问题的实际场景。要通过输入n,m,k 3个整数,求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是一个链表的尾元素指针像队首元素;

            解决问题的核心步骤如下:

                     (1)建立一个具有n个节点、无头节点循环链表

                      (2)确定第1个报数的位置。

                      (3)不断地从链表中删除节点,直到链表为空为空

题3:使用两个栈实现一个队列

解析:假设两个栈A,B,且都为空。

            可以认为A提供入队的功能,栈B提供出队的功能。

            入队列:入队A.

            出队列:如果栈B不为空,直接从栈B中弹出

                            如何栈B为空,一次出栈A,并将元素放入B栈中,知道A为null,然后B出栈。

题4:使用两个队列试下一个栈

           


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值