Êý¾Ý½á¹¹(Java°æ)-ϰÌâ½â´ðÓëʵÑéÖ¸µ¼ ÏÂÔØ±¾ÎÄ

0¡Üs

public Josephus(int n, int s, int d) {

if (n<=0 || s<0 || s>=n || d<=0 || d>=n) throw new java.lang.IllegalArgumentException(\£¬s=\£¬d=\//ÎÞЧ²ÎÊýÒì³£

System.out.print(\£¬\

SinglyList list = new SinglyList(); //¹¹Ôì¿Õµ¥Á´±í

for (int i=n-1; i>=0; i--)

list.insert(0, (char)('A'+i)+\ //µ¥Á´±íÍ·²åÈ룬O(1)

System.out.println(list.toString()); //Êä³öµ¥Á´±íµÄÃèÊö×Ö·û´®£¬O(n)

//ÒÔÏÂÇó½âJosephus»·

Node front = list.head; //frontÖ¸ÏòÍ·½áµã

for (int j=0; front!=null && j

front = front.next;

while (n>1) //¶àÓÚÒ»¸öÔªËØÊ±Ñ­»·

{

for (int j=1; j

{ front = front.next;

if (front==null) //ʵÏÖÑ­»·¼ÆÊý

front = list.head.next; }

if (front.next==null) //ÈôfrontÖ¸Ïò×îºóÒ»¸ö½áµã£¬Ôòɾ³ýµÚ0¸ö½áµã

front = list.head;

System.out.print(\ɾ³ý\£¬\

- 13 -

front.next = front.next.next; //ɾ³ýfrontµÄºó¼Ì½áµã£¬°üÀ¨Í·¡¢Öмä/βɾ³ý

n--;

System.out.println(list.toString()); }

System.out.println(\±»ÉâÃâÕßÊÇ\ //get(0)»ñµÃÔªËØ£¬O(1)

}

Ö´ÐÐnew Josephus(5,0,3)£¬µ¥Á´±íµÄ±ä»¯¹ý³ÌÈçͼ2.7Ëùʾ¡£

datanextheadABfrontCDE¡Ä(a) ´ÓA¿ªÊ¼¼ÆÊý£¬É¾³ýC½áµã£»frontÖ¸ÏòC½áµãµÄǰÇýB£¬Öмäɾ³ýfrontheadABDE¡Ä(b) ´ÓD¿ªÊ¼¼ÆÊý£¬É¾³ýA£¬Ñ­»·¼ÆÊý£»Í·É¾³ýfrontheadBDE¡Ä

(c) ´ÓB¿ªÊ¼¼ÆÊý£¬É¾³ýE£»Î²É¾³ýfrontheadBD¡ÄheadD¡Ä(e) Ò»¸ö½áµãµÄµ¥Á´±í(d) ´ÓB¿ªÊ¼¼ÆÊý£¬É¾³ýB£¬Ñ­»·¼ÆÊýͼ2.7 ʹÓõ¥Á´±íÇó½âJosephus(5,0,3)»·ÎÊÌâµÄÖ´Ðйý³Ì

¡¾Ï°2.2¡¿ ¼¯ºÏ²¢ÔËË㣬µ¥Á´±íÉ±´µÄÓ¦Óá£

±¾ÌâÄ¿µÄ£º¢Ù µ¥Á´±í×÷Ϊ·½·¨²ÎÊýÓë·µ»ØÖµ£¬´«µÝ¶ÔÏóÒýÓã»¢Ú µ¥Á´±íÉ±´Ó¦Óá£

µ±¶ÔÏó×÷Ϊ·½·¨µÄ²ÎÊý»ò·µ»ØÖµÊ±£¬²ÎÊý´«µÝÔ­Ôòͬ¸³Öµ£¬¡°ÒýÓòÎÊý´«µÝ¶ÔÏóÒýÓá±£¬¼´ÐÎʽ²ÎÊý»ñµÃʵ¼Ê²ÎÊýµÄ¶ÔÏóÒýÓá£

SinglyListµ¥Á´±íÀàÉùÃ÷ÒÔϳÉÔ±·½·¨£¬ÊµÏÖ¼¯ºÏ²¢ÔËËã¡£

//ÔÚthisµ¥Á´±íÖ®ºóÁ¬½ÓlistµÄËùÓнáµã£¬¼¯ºÏ²¢£»ÉèÖÃlistΪ¿Õ£¬O(n)

public void concat(SinglyList list) {

- 14 -

Node rear=this.head;

while (rear.next!=null) //ѰÕÒthisµ¥Á´±íµÄ×îºóÒ»¸ö½áµã

rear = rear.next;

rear.next = list.head.next; //β²åÈëlistµ¥Á´±í

list.head.next=null; //ÉèÖÃlistΪ¿Õ£¬·ñÔòÂß¼­´í¡£·½·¨ÌåÄڿɸıä²ÎÊýlistÒýÓõĵ¥Á´±í

}

//¸´ÖÆlistËùÓнáµã²åÈëµ½thisµ¥Á´±íÖ®ºó£¬¼¯ºÏ²¢£¬²»¸Ä±älist public void addAll(SinglyList list) {

this.concat(new SinglyList(list)); //ÏÈÖ´Ðе¥Á´±íÉ±´£¬ÔÙÁ¬½Ó¸´ÖƵÄlist

}

//·µ»Ø¸´ÖÆthisºÍlistºÏ²¢Á¬½ÓµÄµ¥Á´±í£¬²¢¼¯£¬²»¸Ä±äthisºÍlist

public SinglyList union(SinglyList list) {

SinglyList result = new SinglyList(this); //É±´thisµ¥Á´±í

result.addAll(list);

return result; //·µ»ØresultÒýÓõĵ¥Á´±í£¬ÊÍ·Åresult±äÁ¿

}

Éè´´½¨µ¥Á´±ílistaºÍlistb£¬·Ö±ðµ÷ÓÃÉÏÊö·½·¨£¬Ëã·¨ÃèÊöÈçͼ2.14Ëùʾ¡£

ʵ¼Ê²ÎÊýÐÎʽ²ÎÊýheadlistathislistbdatanexta¡Äxby¡Ärearc

list(a) µ÷ÓÃlista.concat(listb)£¬´«µÝ¶ÔÏóÒýÓã¬this¡¢list·Ö±ðÒýÓÃlista¡¢listb¶ÔÏó£» ÔÚthisÖ®ºóÁ´½Ólist£¬ÔòÁ½Ìõµ¥Á´±í¹²ÓÃx¡¢y½áµã£¬Âß¼­´í£»ÉèÖÃlistΪ¿Õ- 15 -

listathislistblistheadax¡Äxbyy¡Ä¡Ärearc

(b) µ÷ÓÃlista.addAll(listb)£¬listÉ±´listb£¬thisÁ¬½ÓµÄÊÇlist¡£ÊÍ·Ålist£¬²»¸Ä±älistbheadlistathisresultlistblist¡Äaaxxbbyy¡Ä¡Äcc¡Ärear

(c) µ÷ÓÃlista.union(listb)£¬result£¨É±´this£©Á¬½Ólist£¨É±´listb£©£¬ ·µ»ØresultÒýÓõĵ¥Á´±í¡£ÊÍ·ÅresultºÍlist£¬²»¸Ä±älista¡¢listbͼ2.8 ¼¯ºÏ²¢ÔËË㣬µ¥Á´±íÉ±´µÄÓ¦ÓÃ

4. Ñ­»·µ¥Á´±í

¡¾Ë¼¿¼Ìâ2-10¡¿ÄÜ·ñʹÓÃÒÔÏÂÓï¾ä´´½¨Ñ­»·µ¥Á´±íµÄÍ·½áµã£¿ÎªÊ²Ã´£¿

head = new Node(null, head); //´´½¨Ñ­»·µ¥Á´±íµÄÍ·½áµã ¡¾´ð¡¿²»ÄÜ¡£ÒòΪÉêÇë½áµã´æ´¢¿Õ¼äʱheadûÓгõʼ»¯£¬²»ÊÇnull¡£Êµ¼ÊÓïÒåÐèÒªµÄÊǽ«¸Ã½áµãµØÖ·×÷ΪÆänextÓòÖµ£¬×ö²»µ½¡£

2.3.2 Ë«Á´±í

1. Ë«Á´±í½áµã

ϰ2-11 DoubleNodeÀàÄÜ·ñÉùÃ÷ÈçÏ£¬¼Ì³Ðµ¥Á´±í½áµãÀàNode£¿ÎªÊ²Ã´£¿

public class DoubleNode extends Node //Ë«Á´±í½áµãÀ࣬¼Ì³Ðµ¥Á´±í½áµãÀà

{

public DoubleNode prev; //Ö¸ÏòǰÇý½áµãµÄµØÖ·Óò

}

- 16 -

¡¾´ð¡¿²»ÄÜ¡£¢Ù ËäÈ»¸ÃÉùÃ÷ûÓÐÓï·¨´í£¬µ«ÓÐÓïÒå´í£¬ÒòΪ´Ó¸¸Àà¼Ì³ÐÀ´µÄnextÀàÐÍΪNode£¬ÈÔȻָÏòµ¥Á´±í½áµã£¬µÈ¼ÛÓÚÒÔÏÂÉùÃ÷£º

public class DoubleNode //Ë«Á´±í½áµãÀà

{

public T data;

public Node next; //Âß¼­´íÎó

public DoubleNode prev; };

´Ë´¦ÐèÒªnextÖ¸ÏòË«Á´±í½áµã£¬ÀàÐÍÊÇDoubleNode£¬Á½Õß½áµã½á¹¹²»Í¬¡£

¢Ú ËäÈ»´ÓÓï·¨ÉÏDoubleNode¿ÉÒÔÉùÃ÷ÈçÏ£¬½«nextÖØÐÂÉùÃ÷ΪDoubleNodeÀàÐÍ£¬µ«ÊÇË«Á´±í½áµãÓëµ¥Á´±í½áµãÎ޹أ¬²¢²»ÊÇÁ½¸ö¾ßÓаüº¬¹ØÏµµÄ¸ÅÄî¡£

public class DoubleNode extends Node {

public DoubleNode prev,next; //prevÖ¸ÏòǰÇý½áµã£¬nextÖ¸Ïòºó¼Ì½áµã

public data,DoubleNode DoubleNode(T prev,DoubleNode next)

{

// super(data,next); //ÓïÒå´í£¬¸³Öµsuper.next£¨ÀàÐÍΪNode£©

super(data,null);

this.next = next; //¸³Öµthis.next£¨ÀàÐÍΪDoubleNode£©

this.prev = prev; } }

?×¢Ò⣺´ËʱDoubleNodeÀàÓÐÁ½¸önext£¬Ê¹ÓÃthisºÍsuperÒýÓÿÉÇø·ÖÁ½Õߣ¬´Ó¸¸Àà¼Ì³ÐÀ´µÄsuper.nextÀàÐÍΪNode£»×ÓÀàÖØÐÂÉùÃ÷µÄthis.nextÀàÐÍΪDoubleNode£¬this.nextÒþ²Øsuper.next£¬¹¹Ôì·½

- 17 -