理解数组和链表的最基本特性

作者:Flyingis<o:p></o:p>

<o:p> </o:p>

数组和链表是数据结构中老生常谈的问题,在指针或是引用这些概念出来之前,数组就能用来实现链表的功能。这里所说的链表指的就是用指针或对象的引用来设计的链表。<o:p></o:p>

在实际的应用开发中,数组由于它天生的种种特性(参考Java容器分析数组》),更多的会被开发人员所想到用到,但所有的数据结构都有它特定的适用场合。众所周知,数组和链表最大的区别在于,使用数组能够快速访问数组中的每个元素,而使用链表可以方便的操纵每个数据项。下面通过两个很有趣的例子说明了它们各自的区别与优势。<o:p></o:p>

虽然在JDKJava提供了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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值