Menu
CoddyTech

Reorder List

لديك قائمة مترابطة أحادية مخزّنة في مصفوفتين لهما الطول نفسه. تحمل العقدة i القيمة values[i] وترتبط بالعقدة next[i]، وتنهي -1 القائمة، والعقدة 0 هي الرأس. لا تُخزَّن العقد بترتيب القائمة، لذا اتبع الروابط.

سمِّ العقد وفق ترتيبها في القائمة L0, L1, ..., Lk. أعد ترتيب القائمة لتصبح L0, Lk, L1, Lk-1, L2, Lk-2, ...: العقدة الأولى، ثم الأخيرة، ثم الثانية، ثم ما قبل الأخيرة، وهكذا. أعد القيم بهذا الترتيب الجديد.

الدالة

reorderList(next: integer-array, values: integer-array) → integer-array
nextinteger-array
فهرس العقدة التي ترتبط بها كل عقدة، أو ‎-1‎ للعقدة الأخيرة
valuesinteger-array
القيمة التي تحتويها كل عقدة
تُرجعinteger-array
القيم بترتيب القائمة المُعاد ترتيبها

القيود

  • 1 ≤ n ≤ 4000، حيث إن n هو طول next وطول values.
  • -1000 ≤ values[i] ≤ 1000
  • كل next[i] يساوي -1 أو فهرس عقدة من 0 إلى n-1.
  • ابتداءً من العقدة 0، تزور القائمة كل عقدة مرة واحدة بالضبط، ثم تصل إلى -1. لا توجد دورة.

أمثلة

المدخلات
next = [3, 4, -1, 1, 2]values = [1, 3, 5, 2, 4]
المخرجات
[1, 5, 2, 4, 3]
الشرح
باتباع الروابط من العقدة 0، تُقرأ القائمة هكذا: 1, 2, 3, 4, 5. الأول، والأخير، والثاني، وما قبل الأخير يعطون 1, 5, 2, 4، وتأتي القيمة الوسطى 3 أخيرًا.
challenge icon

سؤال إضافي

هل يمكنك إعادة ترتيب الروابط نفسها باستخدام ذاكرة إضافية O(1)؟

إعادة ضبط الشيفرة
def reorderList(next, values):
    # اكتب الشيفرة هنا

اختبار #1

اختبار #2

اختبار #3

الوسائط

next = [3, 4, -1, 1, 2]
values = [1, 3, 5, 2, 4]

الإخراج المتوقع

[1, 5, 2, 4, 3]