作者:Flyingis
数组和链表是数据结构中老生常谈的问题,在指针或是引用这些概念出来之前,数组就能用来实现链表的功能。这里所说的链表指的就是用指针或对象的引用来设计的链表。
在实际的应用开发中,数组由于它天生的种种特性(参考《Java容器分析—数组》),更多的会被开发人员所想到用到,但所有的数据结构都有它特定的适用场合。众所周知,数组和链表最大的区别在于,使用数组能够快速访问数组中的每个元素,而使用链表可以方便的操纵每个数据项。下面通过两个很有趣的例子说明了它们各自的区别与优势。
虽然在JDK中Java提供了List接口及其接口的实现(ArrayList/LinkedList)对链表数据结构提供了有力的支持,具体可以参考《Java容器分析—List和Set》但下面数学上关于Josephus问题的实现仅使用了自定义的最简单的链表结构。
/**
* 根据命令行输入的N值,计算出所有小于N的素数
* 是素数将数组元素值设为true,否则设为false
*/
class ArrayApp {
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
boolean[] a = new boolean[N];
for (int i = 2; i < N; i++)
a[i] = true;
for (int i = 2; i < N; i++)
if (a[i] != false)
for (int j = i; j*i < N; j++)
a[i*j] = false;
for (int i = 2; i < N; j++)
if (a[i])
System.out.println(“” + i);
}
}
/**
* N个有编号的小球围成一圈,每个M-1个就拿去一个小球,计算最后剩下的球的位置
*/
class LinkApp {
static class Node {
int value;
Node next;
Node (int v) { v = value; }
}
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
int M = Integer.parseInt(args[1]);
Node first = new Node(1);
Node x = first;
for (int i = 2; i <= N; i++)
x = (x.next = new Node(i));
x.next = first;
while (x != x.next) {
for (int i = 1; i < M; i++)
x = x.next;
x.next = x.next.next;
}
System.out.println(“最后剩下的小球:” + x.value);
}
}