日期:2014-05-20  浏览次数:20780 次

约瑟夫问题,找错,
下面的程序模拟约瑟夫问题,但是在删除头结点的时候删不掉是怎么回事?求大神指点
package com.wwy.thirdTest;

public class Test3_61 {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Node head = new Node("1");
Test3_61 t = new Test3_61();
t.create(head,4);
//System.out.println(head.next.next.next.next.next.data);
t.print(head);
t.display(head,1);

}

//跳过n-1个节点 
public  void display(Node head,int n)
{
Node start = head;
int j = 0;
while(start.next != start)
{
j = 0;
while(j < n)
{
j++;
start = start.next;
}
remove(head,start);
start = start.next;
print(head);
}
}

//删除节点
public  Node remove(Node head,Node del_previous)
{
//System.out.println(123414);
Node del = del_previous.next;
System.out.print("delete:  " + del.data + "  ");
if(del == head)
{
//System.out.println("435");
//问题在这
head = del.next;
}
else  
{
del_previous.next = del.next;
}
return head;
}

//打印链表
public  void print(Node head)
{
Node p = head;
        System.out.print( "剩下的链表   :  ");
        do
        {
            System.out.print(p.data + " -> ");
            p = p.next;
        } while (p != head);
        System.out.println();
}

//创建n个节点的单向循环链表
public  void create(Node head,int n)
{
Node temp = head;
for(int i = 1;i <= n;i++)
{
if(i == n)
{
temp.next = new Node(" " + (i + 1));
temp = temp.next;
temp.next = head;
return;
}else
{
temp.next = new Node(" " + (i + 1));
temp = temp.next;
}

}

}

//节点类
public static class Node
{
Node next;
String data;

public Node(String data)
{
this.data = data;
}
}

}

------解决方案--------------------
怎么还顺序结构呢?这种问题明显是链式结构来做:

public class Test {
@Test
public void testYue(){
int n=8,m=4,s=1;
this.yueSeFu(n, s, m);
}

/**  约瑟夫环问题,利用单循环链表即可,注意边界处理
 * @param n     总的人数
 * @param s     一开始从第几个人开始报数
 * @param m     每次数的人数
 * 
 * 思想1、根据n,创建循环链表
 *     2、找到第一次的startNode