1、一些常见算法的java实现package About4Algorithm;import java.util.ArrayList;/解决方案1/测试一个链表是否是循环链表java实现/当一个链表的尾节点的下一个节点和头节点一样时,此链表即为循环链表/解决方案2/例如N1-N2-N3-N4-N5-N2就是一个有环的链表,/环的开始结点是N5这里有一个比较简单的解法。/设置两个指针p1,p2。每次循环p1向前走一步,p2向前走两步。/直到p2碰到NULL指针或者两个指针相等结束循环。如果两个指针相等则说明存在环。 class ListItem ListItem prevoius; ListItem
2、next ; String data; /构造器,可传入参数对链表进行初始化; public ListItem(ListItem previous , String data , ListItem next) this.prevoius = previous; this.data = data; this.next = next; public ListItem getPrevoius() return prevoius; public void setPrevoius(ListItem prevoius) this.prevoius = prevoius; public ListItem g
3、etNext() return next; public void setNext(ListItem next) this.next = next; public String getData() return data; public void setData(String data) this.data = data; public class CircularLinkedListTest public static void main(String args) /初始化List ListItem a = new ListItem(null, a, null); ListItem b =
4、new ListItem(null, b, null); ListItem c = new ListItem(null, c, null); ListItem d = new ListItem(null, d, null); a.setPrevoius(d); a.setNext(b); b.setPrevoius(a); b.setNext(c); c.setPrevoius(b); c.setNext(d); d.setPrevoius(c); d.setNext(a); /新建存放链表的数组 ArrayList list = new ArrayList(); list.add(a); l
5、ist.add(b); list.add(c); list.add(d); /判断是否为循环链表 boolean circular = false;/ ListItem start = a; ListItem current1 = a; ListItem current2 = a; for(int i = 0 ; i list.size() ; i +) /current2.next.next中为null时,表示链表不是循环的. if(current2.next.next!= null) current1 = current1.next; current2 = current2.next.ne
6、xt; if(current1.equals(current2) circular = true; if(circular) System.out.println(是循环链表); else System.out.println(不是循环链表); package About4Algorithm;import java.util.ArrayList;/找出单链表的中间节点/这道题和解判断链表是否存在环,我用的是非常类似的方法,只不过结束循环的条件和函数返回值不一样罢了。/设置两个指针p1,p2。每次循环p1向前走一步,p2向前走两步。当p2到达链表的末尾时,p1指向的时链表的中间。 /创建一个链表
7、的类class Link private Link next; private String data; Link(Link next, String data) this.next = next; this.data = data; public Link getNext() return next; public void setNext(Link next) this.next = next; public String getData() return data; public void setData(String data) this.data = data; public cla
8、ss FindMidNodeOfLinkedList public static void main(String args) / 对链表进行初始化 Link l1 = new Link(null, a); Link l2 = new Link(null, b); Link l3 = new Link(null, c); Link l4 = new Link(null, d); Link l5 = new Link(null, e); Link l6 = new Link(null, f); l1.setNext(l2); l2.setNext(l3); l3.setNext(l4); l4.
9、setNext(l5); l5.setNext(l6); l6.setNext(null); / 将链表 保存在ArrayList中 ArrayList list = new ArrayList(); list.add(l1); list.add(l2); list.add(l3); list.add(l4); list.add(l5); list.add(l6); Link current1 = null; current1 = l1; Link current2 = l1; / 每次循环p1向前走一步,p2向前走两步。当p2到达链表的末尾时,p1指向的时链表的中间。 for (int i
10、= 0; i list.size(); i+) if (current2.getNext().getNext() != null) current1 = current1.getNext(); current2 = current2.getNext().getNext(); System.out.println(current1.getData(); package About4Algorithm;/求解约瑟环问题/15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免遇难/30个人围成一个圆圈,从第一个人开始一次报数,每数到第九个人,就将他扔入大海/如此循环,直到仅余
11、15人为止/方案1/使用一个boolean数组,一开始,全部位置为true/每数到9时,就将其设为false,则此位置为非教徒的位置/如果该位置已经为false ,则设置下一个true位置为false/如果已经循环到底,则从第一个开始public class JosephRing public static void main(String args) /有一个boolean数组记录当前的30个人,扔下还的人为false,还留下的人为true boolean flag = new boolean30;/ try for(int i = 0 ; i 15) /计数器+1 countNum+; /
12、当计数器数到9时,进入 if( countNum = 9 ) /如果当前的数已经为false了,证明这个人已经被扔进了大海 /那么就找其下一个为true的人扔进大海 while(flagindex != true) countNum +; index+; /计数器清零,把当前人设为false,leftPeople-1 countNum = 0 ; flagindex = false; leftPeople-; /指针向下移动,当index和数组大小一致时,从头开始 index+; if(index = flag.length) index = 0 ; int count = 0 ; for(i
13、nt i = 0 ; i 2-3-4-5 通过反转后成为5-4-3-2-1。/最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,/然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历class LinkItem1 LinkItem1 next; String data; public LinkItem1() / TODO Auto-generated constructor stub public LinkItem1 getNext() return next; public void setNext(LinkItem1 next) this.
14、next = next; public String getData() return data; public void setData(String data) this.data = data; public class LinkedListReverse public static void reverse() /初始化链表 LinkItem1 a = new LinkItem1(); LinkItem1 b = new LinkItem1(); LinkItem1 c = new LinkItem1(); LinkItem1 d = new LinkItem1(); LinkItem
15、1 e = new LinkItem1(); LinkItem1 f = new LinkItem1(); a.setData(a); a.setNext(b); b.setData(b); b.setNext(c); c.setData(c); c.setNext(d); d.setData(d); d.setNext(e); e.setData(e); e.setNext(f); f.setData(f); f.setNext(null); /新建存放链表的数组 ArrayList list = new ArrayList(); list.add(a); list.add(b); list
16、.add(c); list.add(d); list.add(e); list.add(f); /定义链表的前驱为previous; LinkItem1 previous = a; /定义链表的当前节点为current; LinkItem1 current = previous.next; /定义链表的后继节点为next; LinkItem1 next ; for(int i = 0 ; i list.size(); i +) if(current.next != null) /当前节点的后继传给next next = current.next; /将前驱的节点传给当前的后继 current.
17、next = previous; /将 previous = current; current = next; / a.next = null;/ a = previous;/ System.out.println(previous.next.getData();/ for(int j = 0 ; j list.size() ; j+)/ System.out.println(previous.getData();/ previous = previous.next;/ public static void main(String args) reverse(); package About4
18、Algorithm;/单例模式public class Singleton private static Singleton instance = null; /私有构造函数,不允许在外部被实例化 private Singleton() /静态公有函数,只会实例化一次 public static Singleton getInstance () if(instance = null) instance = new Singleton(); return instance ; public static void main(String args) Singleton s1 = Singleto
19、n.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1=s2); System.out.println(s1); System.out.println(s2); package About4Algorithm;/java实现折半查找问题public class BinarySearch /实现二分查找函数 public static boolean binarySearch(int a, int x ) int min = 0 ; int mid = 0; int max = 0 ; max
20、= a.length - 1; while(min = max) mid = (min + max)/2; if(amid x) max = mid - 1; else return true; return false; /给出的a数列必须是有序的.如果想算法更加完美可以对a先进行排序再查找 public static void main(String args) int a = -5,-4,-2,11,13; int x = 11; boolean result = binarySearch(a, x); System.out.println(result ); package About
21、4Algorithm;/最大子序列和问题public class Test1 /联机算法复杂度求解最大自序列和问题函数 public static int maxSubSum(int a) int maxSum = 0 ; int thisSum = 0 ; for(int j = 0 ; j maxSum) maxSum = thisSum ; else if (thisSum 0 ) thisSum = 0; return maxSum; public static void main(String args) int a = -2,11,-4,13,-5,-2; int result =
22、 maxSubSum(a); System.out.println(Result = + result); package About4Algorithm;/计算最大公因数public class Test3 public static int gcb(int m , int n ) while(n != 0) int temp = m % n ; m = n ; n = temp; return m; public static void main(String args) int result = gcb(200,57); System.out.println(result); packa
23、ge About4Algorithm;import java.util.ArrayList;/对文件进行遍历class Folder private ArrayList list = new ArrayList(); /当发现是文件夹是,遍历文件夹里的所有内容 public void scan() System.out.println(遍历文件夹.); for( Folder f : list ) (Folder)f).scan(); public void add(Folder e) list.add(e); class File extends Folder public void sca
24、n() System.out.println(遍历文件.); public class Test4 public static void main(String args) Folder folder1,folder2,folder3; folder1 = new Folder(); folder2 = new Folder(); folder3 = new Folder(); File f1,f2,f3; f1 = new File(); f2 = new File(); f3 = new File(); folder1.add(f1); folder2.add(folder1); folder3.add(f2); folder3.add(f3); folder3.add(f2); folder3.add(folder2); folder3.scan(); package About4Algorithm;/判断两个数组中是否有相同的数字/方案1/给定两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字?/这个问题首先想到的是一个O(nlogn)的算法。/就是任意挑选一个数组,遍历这个数组的所有元素,/遍历过程中,在另一个数组中对第一个数组中的每个元素进行binary search。public
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1