用数组去模拟一个循环链表

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];
    }

 

posted @ 2019-08-06 12:47  LeeJuly  阅读(767)  评论(0)    收藏  举报