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