0

以下代码中使用了哪个 ADT,您如何得出这个结论?我有一种预感,它是一个循环链表,但不知道为什么

public class Josephus {
   private final int M = 3;

   private class Soldier {
      int num;
      Soldier next;
      Soldier(int n) {
         num = n;
      }
   }

   public void survivor(int N) {
      System.out.println("Number of soldiers = " + N);

      if (N <= 0)
         return;

      Soldier first = new Soldier(0);
      Soldier curr = first;
      for (int i =1; n<N; i++) {
         curr.next = new Soldier(i);
         curr = curr.next;
      }
      curr.next = first;

      Soldier prev = curr;
      int d = 0;
      int m = 0;
      while (curr != prev) {
         if(++m >= M){
            d++;
            System.out.println("Dead soldier = " + curr.num);
            if (curr.num == 0) {
               System.out.println("You died as number = " + d);
            }
            prev.next = curr.next;
            m = 0;

         } else
            prev = curr;
         curr = curr.next;
      }
      System.out.println("Final survivor is = " + curr.num);
   }
}
4

3 回答 3

3

我不是数据结构专家,但我相信你的循环链表直觉是正确的。首先,我注意到以下代码部分代表了数据结构的典型“节点”:

private class Soldier {
   int num;
   Soldier next;
   Soldier(int n) {
      num = n;
   }
}

在这里我们可以看到这Soldier next;是对下一个节点的引用。当你看到一个由它自己的对象组成的类时,通常是一个死的赠品。现在,没有“前一个”字段或“左/右孩子”字段。这表明我们不是在处理二叉树、双向链表或任何类似性质的东西。留下单链表或循环链表。

这里是构建链表的地方:

Soldier first = new Soldier(0);
Soldier curr = first;
for (int i =1; n<N; i++) {
   curr.next = new Soldier(i);
   curr = curr.next;
}

我们可以看到,for 循环的每次迭代都会创建一个new Soldier对象,然后将上一次迭代中的节点引用分配给这个新的士兵:

curr.next = new Soldier(i);

接下来,我们将新构造的Soldier对象分配给curr,以便在我们的下一次迭代中,我们可以让它指向列表中的下一个节点:

curr = curr.next;

在循环结束时,我们最终得到指向 null 的最终节点。如果没有解决这个问题,那么我们将有一个单链表。然而,情况并非如此,正如我们在紧随其后的行中看到的那样:

curr.next = first;

这是最后添加的节点的引用被分配给列表中的第一个节点(在此处初始化:)Soldier first = new Soldier(0);,从而使列表循环。

其余代码似乎只是在列表上迭代,对数据结构本身没有影响。对不起,如果我说了一些刻意的显而易见的事情,我只是想彻底:)

于 2014-02-20T04:29:02.473 回答
1

这里的问题可以很好地了解所使用的数据结构。约瑟夫斯问题基本上是一个游戏,其中士兵站成一圈,每第 k 个人被淘汰,直到只剩下一个士兵。现在在这里我们需要模拟一个站在一个圆圈中的士兵列表,因此假设使用的数据结构是一个循环链接列表是适当的。

于 2014-02-20T05:46:04.147 回答
1

这是数据结构是循环链表

于 2014-02-20T05:02:04.743 回答