龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

单链表实现Farey序列(2)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
下面是Farey序列的具体实现 1.构造子先设定了两个节点,即n=1的情况; 2.generate(int n)用于生成序列,每次会遍历当前序列,如果具备插入的点,则插入之,且将add

  下面是Farey序列的具体实现

  1.构造子先设定了两个节点,即n=1的情况;

  2.generate(int n)用于生成序列,每次会遍历当前序列,如果具备插入的点,则插入之,且将added设置为真;

  3.如果遍历完后布尔值added为假,则说明序列已构造完成;

  4.整型数turn表示每次需要判断插入的次数,它和前一轮得到的链表长度有关;

public class FareyList {

  private Node head;

  private int size;

  public FareyList() {

    head = new Node(0, 1);

    Node next = new Node(1, 1);

    head.setNext(next);

    size = 2;

  }

  public void insertAfter(Node newNode, Node prev) {

    newNode.setNext(prev.getNext());

    prev.setNext(newNode);

    size++;

  }

  public void generate(int n) {

    if (n <= 0)

      throw new UnsupportedOperationException();

    if (n == 1) {

      printList();

      return;

    }

    boolean added = true;

    while (added) {

      int turn = size - 1;

      added = false;

      Node node1 = head;

      Node node2 = head.getNext();

      for (int i = 1; i <= turn; i++) {

        if ((node1.getDnval() + node2.getDnval()) <= n) {

          Node newNode = new Node(

              node1.getUpval() + node2.getUpval(), node1

                  .getDnval()

                  + node2.getDnval());

          insertAfter(newNode, node1);

          added = true;

        }

        node1 = node2;

        node2 = node2.getNext();

      }

    }

    printList();

  }

  private void printList() {

    Node node = head;

    while (node != null) {

      System.out.print(node.getUpval() + " ");

      node = node.getNext();

    }

    System.out.println();

    node = head;

    while (node != null) {

      System.out.print(node.getDnval() + " ");

      node = node.getNext();

    }

    System.out.println();

  }

  public static void main(String[] args) {

    new FareyList().generate(8);

  }

}

  本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/54836

精彩图集

赞助商链接