نسخة الكود كما يلي: قائمة الحزمة ؛
استيراد java.util.arraylist ؛
/**
* Java Joseph مشكلة: N الأفراد (معرفات مختلفة) يشكلون دائرة ، وابدأوا في حساب M (أي رقم) بدءًا من StartId (أي رقم).
* ثم ابدأ في حساب أرقام M من الشخص التالي ، وسيتم عد العد M في نهاية قائمة الانتظار الجديدة.
* طباعة قائمة الانتظار الجديدة بعد إزالتها
*
* على سبيل المثال
* int n = 10 ؛ // إجمالي عدد الأشخاص
* int m = 3 ؛
* int startIndex = 1 ؛
* Author Hulk 2014 03 20
*
*/
الطبقة العامة Josephlisttest {
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
وقت بدء طويل = system.currentTimeMillis () ؛
اختبار Josephlisttest = New JosephlistTest () ؛
int n = 10 ؛
int m = 3 ؛
int startIndex = 12 ؛
System.out.println ("JosephlistTest: n =" + n + "، m =" + m +
"، startIndex =" + startIndex + "/n/nqueue النتيجة:") ؛
ArrayList <Person> QueUelist = test.queuepreson (N ، M ، startIndex) ؛
لـ (الشخص الشخص: Queuelist) {
System.out.println ("Out Person:" + person) ؛
}
System.out.println ("استخدم الوقت =" +
(System.CurrentTimeMillis () - وقت البدء)) ؛
}
arraylist الخاص <Person> QueUePreson (int n ، int m ، int startIndex) {
ArrayList <Person> queuelist = null ؛
قائمة قائمة الشخصيات = createlist (n) ؛
//list.search () ؛
if ((list! = null) && (list.head! = null)) {
QueUelist = new ArrayList <JosephlistTest.person> () ؛
pnode pnode = list.head ؛
if (startIndex> 0) {
startIndex = startIndex ٪ n ؛
pNode = list.getNode (startIndex) ؛
} آخر {
pNode = list.head ؛
}
عدد int = 1 ؛
بينما (list.size> 0) {
الشخص خارج الخارجي = فارغ ؛
//يجد
if (count == (m - 1)) {
// حذف العقدة التالية
الشخص السابق = pnode.person ؛
Outperson = list.remove (prev) ؛
queuelist.add (Outperson) ؛
//system.out.println (شخص شخص: " + Outperson +" ، size = " + list.size) ؛
العد = 0 ؛
}
pnode = pnode.next ؛
count ++ ؛
}
}
رجع Queuelist
}
PRIVIELLIST CEARESTELIST (int n) {
قائمة personlist = new personlist () ؛
لـ (int i = 0 ؛ i <n ؛ i ++) {
شخص الشخص = شخص جديد (i ، "name_" + (i + 1)) ؛
list.add (أنا ، شخص) ؛
}
قائمة العودة
}
قائمة الشخصيات العامة {
رأس pnode = فارغ ؛
حجم int = 0 ؛
profilelist () {
}
قائمة الشخصيات العامة (شخص) {
الرأس = pnode جديد (شخص ، رأس) ؛
حجم ++ ؛
}
Printip Personlist (PNODE HEAD) {
this.head = الرأس ؛
head.setNext (head) ؛
حجم ++ ؛
}
pnode pnode gethead () {
رأس العودة
}
sethead public void (pnode head) {
this.head = الرأس ؛
}
GetSize () {{
حجم العودة
}
public void setsize (int size) {
this.size = الحجم ؛
}
حجم الفراغ العام (حجم int) {
this.size = الحجم ؛
}
منطقية عامة isempty () {
إرجاع this.size <= 0 ؛
}
الفراغ العام inithead (شخص) {
if (size == 0) {
الرأس = pnode جديد (شخص ، رأس) ؛
} آخر {
pnode no = head ؛
الرأس = pnode جديد (شخص ، لا) ؛
}
حجم ++ ؛
}
إضافة الفراغ العام (مؤشر int ، شخص) {
if (size == 0) {
الرأس = pnode جديد (شخص ، رأس) ؛
head.setNext (head) ؛
//system.out.println("head: " + head) ؛
} آخر {
إذا (الفهرس <0) {
الفهرس = 0 ؛
}
if (index> size) {
الفهرس = الحجم ؛
}
pnode no = head ؛
لـ (int i = 0 ؛ i <(index - 1) ؛ i ++) {
لا = رقم next ؛
}
pnode newNode = pnode جديد (الشخص ، رقم next) ؛
رقم Next = NewNode ؛
}
حجم ++ ؛
}
الشخص العام حذف (int index) {
pNode pNode = إزالة (فهرس) ؛
if ((pnode! = null) && (pnode.next! = null)) {
إرجاع pnode.next.person ؛
}
العودة لاغية.
}
إزالة pnode العامة (int index) {
if (size == 0) {
العودة لاغية.
} آخر {
if ((index <0) || (index> = size)) {
العودة لاغية.
}
}
pnode no = head ؛
لـ (int i = 0 ؛ i <(index - 1) ؛ i ++) {
لا = رقم next ؛
}
رقم next = no.next.next ؛
مقاس--؛
if ((no! = null) && (no.next! = null)) {
العائد رقم next ؛
}
العودة لاغية.
}
/**
* قم بإزالة العقدة التالية لعقدة الشخص ، وأرجع الشخص المحذوف
* Param Preperson
* @إعادة إزالته الشخص
*/
الشخص العام إزالة (الشخص preperson) {
if (preperson == null) {
العودة لاغية.
}
if (size == 0) {
العودة لاغية.
}
pnode prenode = head ؛
int index = -1 ؛
لـ (int i = 0 ؛ i <size ؛ i ++) {
if (prenode.person.id == preperson.id) {
الفهرس = i ؛
استراحة؛
} آخر {
prenode = prenode.next ؛
}
}
الشخص remperson = null ؛
إذا (الحجم <= 1) {
// عقدة واحدة فقط ، احصل على شخصها ووضعها على أنها خالية
Remperson = prenode.person ؛
prenode = null ؛
} آخر {
//prenode.next.person هو القدر
Remperson = prenode.next.person ؛
prenode.next = prenode.next.next ؛
}
مقاس--؛
//system.out.println("deleteing index = " + index +": " + Remperson +" ، size = " + size) ؛
إرجاع ريميرسون ؛
}
تحديث int العام (الشخص src ، شخص القدر) {
if (src == null) {
العودة -1 ؛
}
int index = -1 ؛
pnode no = head ؛
لـ (int i = 0 ؛ i <size ؛ i ++) {
if (src.id == no.person.id) {
رقم Person = Dest ؛
استراحة؛
} آخر {
لا = رقم next ؛
}
}
فهرس العودة ؛
}
مجموعة منطقية عامة (مؤشر int ، شخص) {
إذا (الشخص == فارغ) {
العودة كاذبة
}
if (size == 0) {
العودة كاذبة
} آخر {
if ((index <0) || (index> = size)) {
العودة كاذبة
}
}
pnode no = head ؛
لـ (int i = 0 ؛ i <index ؛ i ++) {
لا = رقم next ؛
}
رقم Person = شخص ؛
العودة صحيح.
}
الشخص العام يحصل على (int index) {
pnode no = getNode (index) ؛
إذا (لا! = فارغ) {
عودة رقم
}
العودة لاغية.
}
pnode pnode getNode (int index) {
if (size == 0) {
العودة لاغية.
} آخر {
if ((index <0) || (index> = size)) {
العودة لاغية.
}
}
pnode no = head ؛
لـ (int i = 0 ؛ i <index ؛ i ++) {
لا = رقم next ؛
}
العودة لا
}
بحث باطل عام () {
int sizelong = الحجم ؛
pnode no = head ؛
لـ (int i = 0 ؛ i <sizelong ؛ i ++) {
System.out.println ("Search INDEX =" + I + "،" + NO) ؛
لا = رقم next ؛
}
}
}
الفئة العامة pnode {
شخص
pnode التالي = null ؛
PNODE () pnode () {
}
PNODE (الشخص الشخصي) {
this.person = شخص ؛
}
pnode العامة (الشخص الشخص ، pnode التالي) {
this.person = شخص ؛
this.next = التالي ؛
}
@تجاوز
السلسلة العامة tostring () {
إرجاع "pnode [person =" + person.id + "، next =" + next.person.id +
"]" ؛
}
الشخص العام getPerson () {
عودة الشخص
}
setperson public void (شخص) {
this.person = شخص ؛
}
pnode pnode getNext () {
العودة بعد ذلك ؛
}
public void setNext (pnode next) {
this.next = التالي ؛
}
}
شخص من الطبقة العامة {
int id = 0 ؛
اسم السلسلة = "" ؛
الشخص العام () {
}
الشخص العام (int id ، اسم السلسلة) {
ممتاز()؛
this.id = id ؛
this.name = name ؛
}
@تجاوز
السلسلة العامة tostring () {
إرجاع "person [id =" + id + "، name =" + name + "]" ؛
}
}
}