Java单链表实现多项式相加、多种方式实现约瑟夫环
来源:互联网 发布:linux scp 断点续传 编辑:程序博客网 时间:2024/06/04 18:47
数据结构复习,代码是最好的说明。
多项式相加-单链表:
节点类:
public class Node implements Cloneable{ //系数、指数、下一个(前两者可用double) private int coefficient; private int exponent; private Node next; public Node(int coefficient, int exponent) { this.coefficient = coefficient; this.exponent = exponent; } public int getCoefficient() { return coefficient; } public void setCoefficient(int coefficient) { this.coefficient = coefficient; } public int getExponent() { return exponent; } public void setExponent(int exponent) { this.exponent = exponent; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } /** * 深拷贝 * @return * @throws CloneNotSupportedException */ @Override public Object clone() throws CloneNotSupportedException { Node node = null; node = (Node) super.clone(); if (node.next!=null){ node.next = (Node) node.next.clone(); } return node; }}单链表类:
public class SingleLinkedList implements Cloneable{ private Node head; public SingleLinkedList(Node head) { this.head = head; } /** * 深拷贝 * @return */ @Override public Object clone(){ SingleLinkedList s = null; try { s = (SingleLinkedList) super.clone(); s.head = (Node) head.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return s; } /** * 多项式append,按指数从大到小排序 * @param coefficient * @param exponent */ public void append(int coefficient, int exponent){ if (coefficient==0){ return; } Node temp = head; //头处理 if (exponent>head.getExponent()){ Node node = new Node(coefficient,exponent); node.setNext(head); head = node; return; } // while (temp.getNext()!=null){ if (exponent<temp.getExponent()&&exponent>temp.getNext().getExponent()){ Node node = new Node(coefficient,exponent); node.setNext(temp.getNext()); temp.setNext(node); return; }else if (exponent==temp.getExponent()){ temp.setCoefficient(temp.getCoefficient()+coefficient); return; } temp = temp.getNext(); } //尾处理 if(exponent==temp.getExponent()){ temp.setCoefficient(temp.getCoefficient()+coefficient); return; }else if(exponent<temp.getExponent()){ Node node = new Node(coefficient,exponent); temp.setNext(node); return; } } /** * 打印 */ public void printAll(){ Node temp = head; while (temp.getNext()!=null){ System.out.print(temp.getCoefficient()+"x^"+temp.getExponent()+(temp.getNext().getCoefficient()>0?"+":"")); temp = temp.getNext(); } System.out.print(temp.getCoefficient()+"x^"+temp.getExponent()); System.out.println(); } /** * 多项式相加返回结果,用的深拷贝 * @param anotherSingleLinkedList * @return */ public SingleLinkedList add(SingleLinkedList anotherSingleLinkedList) { SingleLinkedList result = (SingleLinkedList) anotherSingleLinkedList.clone(); Node temp = head; while (temp.getNext()!=null){ result.append(temp.getCoefficient(),temp.getExponent()); temp = temp.getNext(); } return result; } public static void main(String[] args) { SingleLinkedList a=new SingleLinkedList(new Node(10,5)); a.append(10,4); a.append(10,3); a.append(10,2); a.append(10,1); SingleLinkedList b=new SingleLinkedList(new Node(-5,10)); b.append(-5,11); b.append(-5,8); b.append(-5,9); b.append(-5,7); b.append(-5,5); System.out.println("相加之前:"); a.printAll(); b.printAll(); System.out.println("结果:"); a.add(b).printAll(); System.out.println("相加之后:"); a.printAll(); b.printAll(); }}
节点类:
public class Node { private int num; private Node next; public Node(int num) { this.num = num; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; }}主类:
public class Josehus { /** * * @param n 一公多少人,例如8个人,则编号1-8号 * @param s 开始号码,例如1,则从1号开始报数 * @param m 指定号码,例如3,则报到3的人移除 */ public void josehus(int n,int s,int m){ //表头 Node head = new Node(1); //pre为当前报数者的前继,使得变量最少 Node pre = null; //初始化循环链表,help为辅助变量 Node help = head; for (int i = 2; i <= n; i++) { if (i==s){ pre = help; } help.setNext(new Node(i)); help = help.getNext(); } help.setNext(head); if (pre == null){ pre = help; } //开始报数,报到数则移除链表 int j = 0; while (pre.getNum()!=pre.getNext().getNum()){ if(j == m-1){ System.out.print(pre.getNext().getNum()+"-"); pre.setNext(pre.getNext().getNext()); j = 0; continue; }else { j++; } pre = pre.getNext(); } System.out.print(pre.getNum()); System.out.println(); } public static void main(String[] args) { Josehus j=new Josehus(); j.josehus(8,1,3); }}
约瑟夫环-数组:
public void josehus(int n,int s,int m){ int [] array = new int[n]; for (int i = 0; i < n; i++) array[i] = i+1; int count = 0; int num = n; //两层循环,相当于一个n*n的遍历 while (num > 0) { for (int i = 0; i < n; i++) { //下标移到报数起始位置 if (s != 1) { i = s - 1; s = 1; } //该位置已被移除继续,到下个位置 if (array[i] == 0) continue; //报数增加 count++; //符合要求,则打印、该位置抹0、个数自减 if (count == m) { System.out.print(array[i]+(num==1?"":"-")); array[i] = 0; count = 0; num--; } } }}
参考:http://www.cnblogs.com/michael110/archive/2011/03/25/1995715.html
如有错误,欢迎纠正!
阅读全文
0 0
- Java单链表实现多项式相加、多种方式实现约瑟夫环
- JAVA实现多项式相加
- 多项式相加 单链表实现
- 单链表实现多项式相加
- 多项式相加单链表实现
- 单链表实现多项式相加
- 用Java实现多项式相加
- 单链表实现一元多项式相加
- Java链表形式实现多项式相加
- 链表实现多项式相加
- 链表实现多项式相加
- 数据结构实现一元多项式相加
- 链表实现多项式相加
- 两个多项式相乘和相加的java实现
- java实现约瑟夫环
- java实现约瑟夫环
- java 实现约瑟夫环
- 约瑟夫环--java实现
- 使用hexo+github搭建免费个人博客详细教程
- 史上最简单的SpringCloud教程 | 第十一篇: docker部署spring cloud项目
- Java线程池execute()方法源码解析
- 第一次在CSDN上写博客
- mysql问题列表
- Java单链表实现多项式相加、多种方式实现约瑟夫环
- 1007. Maximum Subsequence Sum (25)
- OSGi 基本原理
- 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)
- C#回顾学习笔记三十二:密封类和密封方法
- 2种内核级反用户态调试方法
- Django开发中form表单post提交出现403问题解决
- Javascript/ES6代理Proxy用法
- Spring Security(19)——对Acl的支持