From d55bae41cef7220aa0f0bf6ca0712c01f989f395 Mon Sep 17 00:00:00 2001 From: Jamshid-Ganiev Date: Sun, 27 Oct 2024 21:29:59 +0900 Subject: [PATCH 1/2] Added: new content on Doubly Linked List in Python with an image --- images/DoublyLinkedList.png | Bin 0 -> 11313 bytes pages/languages/python.mdx | 213 +++++++++++++++++++++++++++++++++++- 2 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 images/DoublyLinkedList.png diff --git a/images/DoublyLinkedList.png b/images/DoublyLinkedList.png new file mode 100644 index 0000000000000000000000000000000000000000..b61faf7b2e6c7f5804337b1446666dbf8f9d2a1b GIT binary patch literal 11313 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 bool: Qolgan methodlarni esa o'zingiz talabdan kelib chiqib tuzasiz degan umiddaman. Asosiysi biz uni qanday implement qilishni tushunib oldik! -### Doubly Linked List +### Doubly Linked List + +Doubly Linked List (DLL) -- bu haqida [bu yerda](https://www.dsalgo.uz/datastructure/linkedlist#doubly-linked-list) qisqacha tanishib oldik. Endi esa DLL ni python dagi implementatsiyasini ko'rib chiqamiz. + +Singly Linked List'dan farqli o'laroq. +> Doubly Linked List - oldinga va orqaga osongina o'tish mumkin bo'lgan ma'lumotlar tuzilmasi hisoblanadi. + +DLL'da element qo'shish, olib tashlash va boshqa amallarni yanada qulayroq bajarish mumkin, chunki har bir node avvalgi va keyingi elementlar haqida ma'lumotga ega. + +![Strukturasi](../../images/doubly-linked-list-created.png) +Keling endi DLL'ni yaratishni boshlaymiz. + +```py showLineNumbers filename="Doubly_linked_list.py" +class Node: + def __init__(self, value: any) -> None: + self.value = value + self.next = None # Keyingi node'ga ko'rsatkich + self.prev = None # Avvalgi node'ga ko'rsatkich + +class DoublyLinkedList: + def __init__(self) -> None: + self.head = None # Ro'yxatning boshini saqlovchi ko'rsatkich + self.tail = None # Ro'yxatning oxirini saqlovchi ko'rsatkich + +my_list = DoublyLinkedList() +``` +Yuqoridagi misolda biz oddiy Doubly Linked List ni yaratdik va ko'rib tuganizdek Singly Linked List bilan taqqoslaganda juda katta farq mavjud emas. Faqatgina `Node` klassiga yangi '`prev`' va `DoublyLinkedList` klassiga '`tail`' attributelarini qo'shyapmiz. Bu bizga ro'yxatni boshidan ham, oxiridan ham osongina manipulatsiya qilish imkonin beradi. Va Natijada biz __Doubly Linked List__ klassini yaratdik. + +Yana usha muammo, qanday qilib biz DoublyLinkedList'ga `Node`larni qo'shib boramiz? + +![Strukturasi](../../images/DoublyLinkedList.png) + +__Element qo'shish(Append):__ + +Keling, yangi elementni Doubly Linked List oxiriga qo'shish uchun mehtod yaratamiz. Yuqoridagidek biz methodni o'zini yozib ketamiz, siz ularni o'z klassingiz ichiga qo'shib tahlil qilishingiz mumkin: + +```py showLineNumbers filename="Doubly_linked_list.py" +def append(self, value: any) -> None: + # Birinchi bo'lib Node classidan yangi object yaratib olamiz. + new_node = Node(value) + + # Agar ro'yxat bo'sh bo'lsa, head va tail bir xil bo'ladi + if self.head is None: + self.head = new_node + self.tail = new_node + return + + # Ro'yxat bo'sh bo'lmasa, oxirgi node'ni yangilaymiz + new_node.prev = self.tail # Yangi node'ning prev'ini oxirgi node'ga bog'laymiz + self.tail.next = new_node # Oxirgi node'ning next'ini yangi node'ga bog'laymiz + self.tail = new_node # Tailni yangi node'ga o'tkazamiz +``` + +Yuqoridagi methodda agar ro'yxat bo'sh bo'lsa, yangi elementni `head` va `tail`ga qo'shamiz. Agarda bo'sh bo'lmasa, oxirgi node'ni yangilab qo'yamiz. + +__Element qo'shish (Insert):__ +Yangi `Node`ni ro'yxat boshiga qo'shish uchun method yaratamiz: + +```py showLineNumbers filename="Doubly_linked_list.py" +def insert(self, value: any) -> None: + # Birinchi bo'lib Node classidan yangi object yaratib olamiz. + new_node = Node(value) + + # Agar ro'yxat bo'sh bo'lsa, head va tail bir xil bo'ladi + if self.head is None: + self.head = new_node + self.tail = new_node + return + + # Ro'yxat bo'sh bo'lmasa, yangi node'ni boshiga qo'shamiz + new_node.next = self.head # Yangi node'ning next'ini hozirgi head'ga bog'laymiz + self.head.prev = new_node # Hozirgi head'ning prev'ini yangi node'ga bog'laymiz + self.head = new_node # Headni yangi node'ga o'tkazamiz +``` + +Yuqoridagi metodda agar ro'yxat bo'sh bo'lsa, yangi node'ni `head` va `tail`ga bog'laymiz. Aks holda, yangi node'ni boshiga qo'shib, `head`ni yangilab qo'yamiz. + +__Elementni olib tashlash (Remove):__ + +Elementlarni qiymat asosida olib tashlash uchun method yaratamiz. + +```py showLineNumbers filename="Doubly_linked_list.py" +def remove(self, value: any) -> bool: + # Ro'yxat bo'sh bo'lsa False qaytaramiz. + if self.head is None: + return False + + # node ni ro'yxat boshiga to'g'irlab olamiz. + current_node = self.head + + # + while current_node: + if current_node.value == value: + # Agar node ro'yxatning boshida bo'lsa. + if current_node == self.head: + self.head = current_node.next + if self.head: + self.head.prev = None + + # Agar node ro'yxatning oxirida bo'lsa. + elif current_node == self.tail: + self.tail = current_node.prev + if self.tail: + self.tail.next = None + + # Agar node ro'yxatning o'rtasida bo'lsa, yani ro'yxatning boshi va oxiri orasida bo'lsa. + else: + current_node.prev.next = current_node.next + current_node.next.prev = current_node.prev + return True + + # agar node qiymati berilgan qiymatga teng bo'lmasa keyingi node ni tekshiramiz. + current_node = current_node.next + return False +``` +Yuqoridagi method node'ni qiymati asosida olib tashlaydi. U boshida, oxirida yoki o'rtasida bo'lishidan qat'iy nazar, tegishli bog'lanishlarni yangilaydi. + +Endi biz quyidagi 2 ta methodni ko'rib chiqamiz. + +```py showLineNumbers filename="Doubly_linked_list.py" + +# Bu method tailni (ya'ni oxirgi elementni) qaytarish uchun. +# Biror qiymatni qidirish uchun ishlatiladi agar bo'lsa True bo'lmasa False qaytaradi. +def search(self, value: any) -> bool: + # Agar Linked List bo'sh bo'lsa False qaytaradi qidirmasdan turib. + if self.head_node is None: + return False + # Agar qiymatlar bo'lsa, iteratsiya qilib ularni qiymatini tekshiriladi. + current_node = self.head_node + while current_node: + if current_node.value == value: + return True + current_node = current_node.next + return False + +# Listdagi barcha node qiymatlarni oxiridan boshlab list ga qo'shadi. +def print_reverse_list(self) -> None: + result = [] + # Agar tail None bo'lsa, linked list bo'sh bo'ladi va [] qaytaradi. + if self.tail is None: + return result + + # Tail'dan boshlanib, orqaga qarab har bir nodeni qiymatini listga qo'shamiz. + current_node = self.tail + while current_node: + result.append(current_node.value) + current_node = current_node.prev + + # Natijani chiqarish + print(result) +``` +__Boshqa method'larchi?__ + +Ko'rib turganingizdek, `print_reverse_list()` method'idan farqli ravishda `search()` ya'ni qidirish metodi biz yuqorida Singly Linked List uchun yaratganimiz bilan bir xil. Qolganlari ham katta farq qilmaydi. Shuning uchun qo'shimcha method'larni o'zingiz yaratib, amaliyot qilshingizga undab qolgan bo'lardim. Masalan, `get_head()`, `print_list()`, `is_empty()` va boshqa methodlarni. + +__Doubly Linked Listdan Foydalanish Misoli__ + +Keling, Doubly Linked Listning qanday ishlashini ko'rib chiqamiz. Biz elementlar qo'shib, ularni bosqichma-bosqich namoyish qilamiz, Singly Linked List misolidagi kabi. + +```py showLineNumbers filename="Doubly_linked_list.py" + +# Doubly Linked Listni yaratish va elementlar qo'shish +my_list = DoublyLinkedList() +my_list.append(1) # Listga 1 qo'shildi +my_list.append(2) # Listga 2 qo'shildi +my_list.append(3) # Listga 3 qo'shildi +my_list.insert(0) # Boshiga 0 elementi qo'shildi + +# List hozir quyidagicha ko'rinishga ega: 0 <-> 1 <-> 2 <-> 3 -> None +``` +Doubly Linked Listni Traverse(elementlarni ko'rib chiqish) qilish. + +1. `Head`dan `tail`gacha oldinga harakatlanish: +```py showLineNumbers filename="Doubly_linked_list.py" +current_node = my_list.head +while current_node: + print(current_node.value) # Natijada quyidagi qiymatlar chiqadi: 0, 1, 2, 3 + current_node = current_node.next +``` +2. `Tail`dan `head`gacha orqaga harakatlanish: +```py showLineNumbers filename="Doubly_linked_list.py" +current_node = my_list.tail +while current_node: + print(current_node.value) # Natijada quyidagi qiymatlar chiqadi: 3, 2, 1, 0 + current_node = current_node.prev +``` + +Doubly Linked Listning To'liq Ko'rinishi: +Agar kodni to'liq ko'rish va ishlashini tushunishni istasangiz, quyidagi misolni o'zingiz albatta sinab ko'ring. + +```py showLineNumbers filename="Doubly_linked_list.py" +# Bu yerda biz Doubly Linked List yaratamiz va metodlarni sinab ko'ramiz. +my_list = DoublyLinkedList() +my_list.append(10) # Listga 10 qo'shildi +my_list.append(20) # Listga 20 qo'shildi +my_list.append(30) # Listga 30 qo'shildi +my_list.insert(5) # List boshiga 5 qo'shildi + +# Hozirgi holat: None <- 5 <-> 10 <-> 20 <-> 30 -> None + +# Listni chop etish +my_list.print_list() # Natija: [5, 10, 20, 30] + +# Listni teskari holatida chop etish +my_list.print_reverse_list() # Natija: [30, 20, 10, 5] +``` +Hozirgacha "`Doubly Linked List`"ni yaxshi tushunib oldingiz degan umiddaman. + +Qo'shimcha o'rganish uchun manbalar: +1. [wikipedia](https://en.wikipedia.org/wiki/Doubly_linked_list) +2. [geeksforgeeks](https://www.geeksforgeeks.org/doubly-linked-list/) +3. [Design Linked List](https://leetcode.com/problems/design-linked-list/description/) ### Circular Linked List From cdf6627cecff494e502b55addacfc54ce566ba43 Mon Sep 17 00:00:00 2001 From: Jamshid-Ganiev Date: Sun, 27 Oct 2024 21:36:23 +0900 Subject: [PATCH 2/2] Added: new content on Doubly Linked List in Python with an image --- pages/languages/python.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pages/languages/python.mdx b/pages/languages/python.mdx index 53e94490..0c42cff5 100644 --- a/pages/languages/python.mdx +++ b/pages/languages/python.mdx @@ -358,7 +358,7 @@ Yana usha muammo, qanday qilib biz DoublyLinkedList'ga `Node`larni qo'shib boram __Element qo'shish(Append):__ -Keling, yangi elementni Doubly Linked List oxiriga qo'shish uchun mehtod yaratamiz. Yuqoridagidek biz methodni o'zini yozib ketamiz, siz ularni o'z klassingiz ichiga qo'shib tahlil qilishingiz mumkin: +Keling, yangi elementni Doubly Linked List oxiriga qo'shish uchun method yaratamiz. Yuqoridagidek biz methodni o'zini yozib ketamiz, siz ularni o'z klassingiz ichiga qo'shib tahlil qilishingiz mumkin: ```py showLineNumbers filename="Doubly_linked_list.py" def append(self, value: any) -> None: @@ -444,8 +444,6 @@ Yuqoridagi method node'ni qiymati asosida olib tashlaydi. U boshida, oxirida yok Endi biz quyidagi 2 ta methodni ko'rib chiqamiz. ```py showLineNumbers filename="Doubly_linked_list.py" - -# Bu method tailni (ya'ni oxirgi elementni) qaytarish uchun. # Biror qiymatni qidirish uchun ishlatiladi agar bo'lsa True bo'lmasa False qaytaradi. def search(self, value: any) -> bool: # Agar Linked List bo'sh bo'lsa False qaytaradi qidirmasdan turib.