-单链表的实现_完善方案
我们在示例中给出的链表类是递归定义的。这样做的好处是链表的某个局部也是一个链表,这与链表在逻辑上的概念具有一致性。
但出于效率的考虑,经常需要引入一些辅助变量来加快操作的速度,这时,如果能给链表类型增加一个外壳就很方便后续的处理。
基本思路:
class MyList
{
private Node head;
class Node{
int data;
Node next;
}
....
}
这种方案中,MyList不是递归定义的,而内部包含的Node类代表了链表的真实结构。MyList类是一个外壳类。它通过持有head 指针来记录一个链表的头在哪里。
请试着完善这种方案。
-双向循环链表_实践应用
定义双向循环链表,解决如下的问题:
有 n 个孩子顺时针站成一圈,其编号为:1,2,3,... n
从1号孩子开始顺时针数数,每个孩子数一个数,遇到7的倍数或数字中含有7,则该孩子不出声,只拍一下手,数数的方向逆转,下一个孩子数下一个数字。
例如:1,2,3...6,拍手,则接下来,6号孩子数8,5号孩子数9 ....
请模拟该过程,如果有20个孩子,求哪个孩子要数100。
-队列与栈_栈结构的应用
栈结构很有用处,有时通过它可以轻松化解一些难题。
看如下问题:
...(.[...)...]...(..(.)..)..{..}.[.]...[[...(.).]..].
请判断一个串中的括号是否匹配
注意下列不匹配的情况:
左括号太多
右括号太多
右括号先于左括号出现 ..)...(...
挎臂情况 ....[...(....]....)....
考虑用栈
-二叉排序树_求二叉树的高度
如果定义一棵二叉树的高度就是从根到叶子的最长距离。试编码求二叉树的高度。
其实,二叉树的高度就是它的左子树和右子树中高度最大值 + 1
另外考虑: 当待排序的数据本来就是有序的情况,会发生什么?
请参考《数据结构》教材解决这个问题。
-一般树形结构_求通路长度
注意树形结构的特点:
从一个节点到另一个节点只有一条通路。
编程求a点到b点的通路长度。
-通用菜单_完善功能
为通用控制台菜单完善功能:
1. 增加“退出”功能,可以在任意位置放弃选择
2. 增加“返回到主菜单”功能,可以在任意深度回到主菜单,而不是逐级向上。
3. 为每个叶子节点(就是最终执行命令)增加一个整数信息,将来选择结束时返回这个整数信息,而不是返回叶子节点的字符串。因为不同路径的字符串可能会是相同的内容。
-智能数组
java提供的数组有个特点: 当数组元素的个数确定后,就不能再追加元素了。
也就是说,数组的大小在创建的时候就固定了。
现在请你来写一个智能数组类 SmartArray,它能够根据需要动态地分配空间。
实际上,它只不过是在其它位置分配新的数组,然后把旧的数据拷贝过去。
请提供数组访问方法:
int get(int idx); // 返回指定位置的元素值
void set(int idx, int value); // 对指定的下标元素设置新值。当然,如果下标超出了原来数组的大小,则自动分配新的空间。
-再谈菜单
请你采用如下的节点结构实现菜单功能。
每个菜单项有4个指针:
parent: 指向父节点
child: 指向第一个孩子节点
left: 指向本节点的“哥哥”
right: 指向本节点的“弟弟”
显示孩子节点的时候,是按从长到幼的次序。