1. 程式人生 > >Java用迴圈連結串列寫的約瑟夫環

Java用迴圈連結串列寫的約瑟夫環

package com;

import java.util.Scanner;

interface SeqList{//規範化實現介面類的操作
//初始化連結串列
ListNode initList();
//插入一個一個節點
ListNode insertNode(int val,ListNode head);
//刪除指定節點
ListNode deleteNode(int val,ListNode head);
//遍歷列印節點
void print(ListNode head);
//約瑟夫環的列印輸出
void print(ListNode head,int k);
}
class ListNode{//構造一個節點類,類似c中的結構體,一定要注意將節點的next設定為空
int val;
ListNode next;
ListNode(int x) {
val = x; this.next=null; 
}
}
public  class  Test1 implements SeqList{


    public static void main(String[] args) {
    Test1 test=new Test1();
    ListNode head=test.initList();//初始化
    /*test.print(head);
    //head=test.insertNode(9, head);
    //test.print(head);
    head=test.deleteNode(1, head);
    //System.out.println(temp.val);
    test.print(head);*/
    test.print(head,3);
   
}


@Override
public  ListNode initList() {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
ListNode head=null;
if(in.hasNext()){
head=new ListNode(in.nextInt());
}
ListNode temp=head;
while(in.hasNext()){//利用ctrl+z結束,尾插法建立連結串列
temp.next=new ListNode(in.nextInt());
temp=temp.next;
}
temp.next=head;//如果想構造迴圈連結串列,可以直接將尾的next連結到頭節點
return head;
}


@Override
public ListNode insertNode(int val, ListNode head) {
// TODO Auto-generated method stub
ListNode temp=null;
if(head==null){
head=new ListNode(val);
}else{
temp=head;
while(temp.next!=null){
temp=temp.next;
}
temp.next=new ListNode(val);

}
return head;//不返回頭結點,連結串列也會修改
}


@Override
public ListNode deleteNode(int val, ListNode head) {
// TODO Auto-generated method stub
if(head==null){
System.out.println("delete error!");
return null;
}
ListNode temp=null;
if(head.val==val){//在頭結點
temp=head;
head=null;
head=temp.next;
}else{
ListNode p=head;

ListNode pre=p;
p=p.next;
while(p!=null){
if(p.val==val){
temp=p;
pre.next=p.next;
}
pre=p;
p=p.next;
}
}
return head;
}


@Override
public void print(ListNode head) {
// TODO Auto-generated method stub
if(head==null) 
System.out.println("head is null");
else{
ListNode p=head;
while(p!=null){
if(p.next==null)
System.out.println(p.val);
else
System.out.print(p.val+"->");
   p=p.next;
   }
}
}


@Override
public void print(ListNode head, int k) {
// TODO Auto-generated method stub
ListNode p=head;
if(head==null){
System.out.println("List is null");
return;
}else{
System.out.println("出圈的順序為:");
ListNode pre;
while(p!=p.next){
for(int i=2;i<k;i++)
p=p.next;
System.out.print(p.next.val+" ");
p.next=p.next.next;//刪除該節點
p=p.next;
    }   
   System.out.println(p.val);
}
}


}