用数组去模拟一个循环链表
1.主要是用两个数组,一个数组用存储数据,另外一个数组用来保存指针,添加的新元素都插入到数据数组的最后一位,插入删除都修改指针数组
然后我们用这个循环链表解决约舍夫环的问题
public class Main1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int[] data=new int[101]; int[] next=new int[101]; for(int i=0;i<n;i++) { data[i]=sc.nextInt();//输入date原始数值 for(int j=0;j<n;j++) { if(j!=n-1)//判断是否是最后一位 next[j]=j+1;//因为是指向下一位的位置所以是i+1 else next[j]=0;//最后一位的下一个默认为0 } } // add(5,50,next,data,n); // add(6,60,next,data,n+1); // add(2,60,next,data,n+1); // del(1,next); // del(2,next); Josephus(next, 2, 5); for(int i=0;i<n;i++) { System.out.println(i+"~"+next[i]+"~"+data[i]); } } //插入到第k个元素后面 public static void add(int k,int now,int next[],int[] data,int n) { int i=0; do { if(--k==0) { next[n]=next[i]; next[i]=n; data[n]=now; return; } i=next[i]; }while(i!=0||k!=0); } //删除下标为k的这个节点后面的节点 public static void del(int k,int next[]) { int temp=next[k]; next[k]=next[temp]; next[temp]=-1; } public static int Josephus(int next[],int m,int n) {//m是报几个数一轮回,n是总人数 int start=0; for(int i=0;i<n-1;i++) { int j=1; int pre=0; while(j++!=m) { pre=start; start=next[start]; } int temp=next[start]; del(pre,next); if(temp==-1) break; start=temp; } return start; } }
2.构建一个循环链表去实现这个功能
public class CircleList { static class node{ int data; node next; public node(int data) { this.data=data; } } private node head,tail;//头尾指针 int size; public CircleList() //构造方法,建一个空链表 { size=0; head=tail=null; } public void addhead(int i)//添加首个节点 { head=new node(i); if(tail == null) tail = head; size++; } public void addtail(int i) { tail.next = new node(i); tail = tail.next; tail.next=head; size++; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); CircleList list=new CircleList(); list.addhead(sc.nextInt()); for(int i=1; i<n; i++) { list.addtail(sc.nextInt()); } node cur=list.head; int i=1; while(i<n) {//删除n-1个节点 i++; for(int j=1;j<m-1;j++) { cur=cur.next; } cur.next=cur.next.next;//删除这个节点 cur=cur.next;//移动到后面这个节点 } System.out.print(cur.data); } }
3.一个数组也是围成一个环,选择一个序列,不能相连,首尾不能相连,求和最大的序列。首尾不能同时选,需要求两次,0号到n-2号,1号到n-1号
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int[] num = new int[n]; for(int i=0; i<n; i++) { num[i]=sc.nextInt(); } int[] first=Arrays.copyOfRange(num, 0, n-1); int[] second=Arrays.copyOfRange(num, 1, n); int maxsum1 = maxSum(first, n-1); int maxsum2 = maxSum(second, n-1); System.out.println(Math.max(maxsum1, maxsum2)); } private static int maxSum(int[] dp, int n) { if(n==1) return dp[0]; int[] contains=new int[n]; if (dp[0]>dp[1]) { dp[1] = dp[0]; } int count1=0; int count2=0; for (int i = 2; i < n; ++i) { count1=dp[i]+dp[i-2];//包含当前位 count2=dp[i-1]; //不包含当前位 if (count1>count2) { dp[i] =count1; }else{ dp[i] =count2; }//更新 } return dp[n-1]; }
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/11308205.html