يتم منحك وظيفتي الاختبار التاليتين: `test_insert_after()` و`test_kkthFromEnd()`.

تختبر الدالة `test_insert_after()` وظيفة إدراج عقدة جديدة بعد عقدة معينة في قائمة مرتبطة. يقوم بإنشاء قائمة مرتبطة بقيم أولية ['a'، 'b'، 'c']، ثم يقوم بإدراج القيمة "z" بعد العقدة ذات القيمة "a". يتحقق الاختبار مما إذا كانت قيمة العقدة التالية بعد "a" تساوي "z".

تختبر الدالة `test_kkthFromEnd()` وظيفة العثور على العقدة k من نهاية القائمة المرتبطة. يقوم بإنشاء قائمة مرتبطة بالقيم الأولية ['a', 1, 'hello World', 5.0, True]. يتحقق الاختبار مما إذا كانت قيمة العقدة التي تبعد k عن نهاية القائمة المرتبطة تساوي 1 عندما تكون k = 3.

مهمتك هي تنفيذ الطريقتين المفقودتين `insert_after()` و`kthFromEnd()` في فئة LinkedList.

تحتاج إلى كتابة فئة "LinkedList" بالطرق التالية:

1. `__init__(self, virtual_values)`: تهيئة قائمة مرتبطة بالقيم_الأولية المحددة.

2. `insert_after(self, value, new_value)`: إدراج عقدة جديدة ذات `new_value` بعد العقدة ذات `value` في القائمة المرتبطة. إذا كانت العقدة ذات "القيمة" غير موجودة، فيجب إدراج العقدة الجديدة في نهاية القائمة المرتبطة.

3. `kthFromEnd(self, k)`: إرجاع قيمة العقدة k من نهاية القائمة المرتبطة. إذا كان الفهرس k خارج النطاق (أي أكبر من أو يساوي طول القائمة المرتبطة)، فسيتم إرجاع لا شيء.

لاحظ أن فئة LinkedList يجب أن تحتوي على فئة عقدة محددة أيضًا. يجب أن تحتوي كل عقدة على سمة `val` لتخزين قيمتها وسمة `_next` لتخزين مرجع إلى العقدة التالية في القائمة المرتبطة.

قم بتنفيذ فئة LinkedList وطرقها لاجتياز وظائف الاختبار المقدمة بنجاح.
{"evolved_from": null, "kind": "synthetic", "source": "argilla/DistiCoder-dpo-binarized"}