darsga qaytish

Bir-biriga bog'langan ro'yxatni teskari tartibda chiqaring

Oldingi Bir-biriga bog'langan ro'yxatni chiqaring topshirig’idan bir-biriga bog’langan ro’yxatni teskari tartibda chiqaring.

Ikkita yechimni toping: tsikldan foydalanish va rekursiyadan foydalanish.

Rekursiyadan foydalanish

Rekursiv mantiq bu erda biroz hiyla-nayrang.

Avvaliga ro’yxatning qolgan qismini chiqarishimiz kerak, keyin joriyini chiqarishimiz kerak:

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null,
      },
    },
  },
};

function printReverseList(list) {
  if (list.next) {
    printReverseList(list.next);
  }

  alert(list.value);
}

printReverseList(list);

Tsikldan foydalanish

To’g’ridan-to’g’ri chiqishdan ko’ra tsikl varianti biroz murakkabroq.

Bizning ro'yxatimizdan oxirgi qiymatni olishning imkoni yo’q. Shuningdek, biz “orqaga qaytishimiz” mumkin emas.

Shunday qilib, biz avval elementlarni to’g’ridan-to’g’ri tartibda ko’rib chiqish va ularni massivda eslab qolish, keyin esa eslab qolgan elementlarni teskari tartibda chiqarish:

let list = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: {
        value: 4,
        next: null,
      },
    },
  },
};

function printReverseList(list) {
  let arr = [];
  let tmp = list;

  while (tmp) {
    arr.push(tmp.value);
    tmp = tmp.next;
  }

  for (let i = arr.length - 1; i >= 0; i--) {
    alert(arr[i]);
  }
}

printReverseList(list);

Iltimos, esda tutingki, rekursiv yechim aslida aynan bir xil narsani bajaradi: u ro’yxatni kuzatib boradi, ichki chaqiruvlar zanjiridagi elementlarni eslaydi (ijro kontekst stekida) va keyin ularni chiqaradi.