Найти Π² Π”Π·Π΅Π½Π΅
2022 подписчика

πŸ¦«Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ односвязного списка Π² Golang


БвязныС списки β€” это Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈ программирования, часто примСняСмыС для хранСния ΠΈ управлСния Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ хранятся Π² смСТных участках памяти. Рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ односвязного списка Π½Π° Go.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² односвязныС списки

Бвязный список β€” это структура Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ·Π»ΠΎΠ², Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТатся Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ссылка Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ односвязныС, двусвязныС ΠΈ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²Ρ‹Π΅ связныС списки.

У односвязного списка:

⬅️ Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ содСрТатся Π΄Π°Π½Π½Ρ‹Π΅.
⬅️ Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ имССтся ссылка β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ next β€Šβ€” Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
⬅️ Π’ послСднСм ΡƒΠ·Π»Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ имССтся ссылка nil, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ указываСтся Π½Π° ΠΊΠΎΠ½Π΅Ρ† списка.

Π£Π·Π΅Π» β€” основа связного списка
Π’ сСрдцС связного списка находится понятиС ΡƒΠ·Π»Π°.

Π£Π—Π•Π› β€” ЭВО Π‘Π’Π ΠžΠ˜Π’Π•Π›Π¬ΠΠ«Π™ Π‘Π›ΠžΠš Π˜Π›Π˜ ΠšΠžΠΠ’Π•Π™ΠΠ•Π , Π’ КОВОРОМ Π‘ΠžΠ”Π•Π Π–ΠΠ’Π‘Π―: 1) БОΠ₯Π ΠΠΠ―Π•ΠœΠ«Π• ДАННЫЕ β€” ЧВО Π‘Π« Π’Π« НИ Π’Π«Π‘Π ΠΠ›Π˜ β€” И 2) Π£ΠšΠΠ—ΠΠ’Π•Π›Π¬ НА ВО, ЧВО Π‘Π›Π•Π”Π£Π•Π’ ДАЛЬШЕ.

Π­Ρ‚ΠΎΠΉ простой структурой формируСтся основа для создания односвязных β€” с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ связанными ΡƒΠ·Π»Π°ΠΌΠΈ β€” списков ΠΈ двусвязных, Π³Π΄Π΅ Ρƒ ΡƒΠ·Π»ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ссылки Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π»Ρ‹:

type Node struct {
data int
next *Node
}

type LinkedList struct {
head *Node
}

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Node здСсь Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ односвязного списка. Π’ Π½Π΅ΠΉ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ основныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° списка:

β–ͺ️ПолС data β€Šβ€” это Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ Π² ΡƒΠ·Π»Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠœΡ‹ Π·Π°Π΄Π°Π»ΠΈ Π΅ΠΌΡƒ цСлочислСнный int, хотя Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.
β–ͺ️ПолС next β€Šβ€” это ссылка ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» связанного списка. Π•ΡŽ ΡƒΠ·Π»Ρ‹ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ. Когда ΡƒΠ·Π΅Π» Π² спискС послСдний, ΠΏΠΎΠ»Π΅ΠΌ next указываСтся Π½Π° nil β€Šβ€” ΠΊΠΎΠ½Π΅Ρ† списка.

ЀактичСски структурой Node опрСдСляСтся, ΠΊΠ°ΠΊ выглядит ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт связного списка β€” с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Π½Π΅ΠΌ содСрТатся, ΠΈ ссылкой Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° LinkedList β€Šβ€” это связный список Π² Ρ†Π΅Π»ΠΎΠΌ, Сю управляСтся Π½Π°Π±ΠΎΡ€ ΡƒΠ·Π»ΠΎΠ²:

β–ͺ️ПолС head β€Šβ€” ссылка ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΠ·Π΅Π» связного списка. Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² список, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ получаСтся доступ ΠΊΠΎ всСй ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡƒΠ·Π»ΠΎΠ² для манипулирования ΠΈΠΌΠΈ.
ВмСстС структуры Node ΠΈ LinkedList β€Šβ€” основа односвязного списка Π½Π° Go. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΎΠΉ Node опрСдСляСтся Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты, структурой LinkedList β€Šβ€” ΠΊΠ°ΠΊ эти элСмСнты ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ†Π΅Π»ΠΎΡΡ‚Π½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ….

Π₯отя связный список создаСтся ΠΈ Π±Π΅Π· Ρ‚ΠΈΠΏΠ° LinkedList, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π³ΠΎ LinkedList β€Šβ€” Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для связного списка, Π³Π΄Π΅ инкапсулируСтся вСсь список, ΠΈ ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, способ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ списка.

Вставка Π΄Π°Π½Π½Ρ‹Ρ… Π² связный список


2 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹