题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:使用两个队列试下一个栈