ЁЯПл The SchoolтА║ЁЯзо DSAтА║ЁЯз╡ рдзрдбрд╛ 03 тАФ Linked lists: рдЦрдЬрд┐рдиреНрдпрд╛рдЪрд╛ рд╢реЛрдз
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯз╡ рдзрдбрд╛ 03 тАФ Linked lists: рдЦрдЬрд┐рдиреНрдпрд╛рдЪрд╛ рд╢реЛрдз

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдкреБрдвреЗ: lesson-04-stacks-queues


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ03. arrays рдиреЗрдордХреЗ рдЬреНрдпрд╛ operation рдордзреНрдпреЗ рд╣рд░рддрд╛рдд рддреЗ рдЬрд┐рдВрдХрдгрд╛рд░рд╛ structure тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореБрд▓рд╛рдЦрддрдХрд╛рд░ рд╡рд┐рдЪрд╛рд░рддреЛ рддреЗ рдЬрд╛рдЧрдЪреНрдпрд╛ рдЬрд╛рдЧреА рдЙрд▓рдЯреЗ рдХрд░рдгреЗ (in-place reversal).

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдпрд╛ рд╡реЗрд│реА lockers рдирд╛рд╣реАрдд тАФ рдПрдХ рдЦрдЬрд┐рдиреНрдпрд╛рдЪрд╛ рд╢реЛрдз. рдкреНрд░рддреНрдпреЗрдХ рдЪрд┐рдареНрдареАрдд рдПрдХ рдирд╛рд╡ рдЕрд╕рддреЗ рдЖрдгрд┐ рддреА рд╕рд╛рдВрдЧрддреЗ рдкреБрдврдЪреА рдЪрд┐рдареНрдареА рдХреБрдареЗ рдЖрд╣реЗ. рдЪреМрдереНрдпрд╛ рдЪрд┐рдареНрдареАрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╛рдпрд▓рд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рддреАрди рд╡рд╛рдЪрд╛рд╡реНрдпрд╛рдЪ рд▓рд╛рдЧрддрд╛рдд; "рдЪрд┐рдареНрдареА рдХреНрд░рдорд╛рдВрдХ 17" рдЕрд╕реЗ рдХрд╛рд╣реА рдирд╕рддреЗ. рдкрдг рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдЪрд┐рдареНрдареА рдЬреЛрдбрдгреЗ рд▓рдЧреЗрдЪ рд╣реЛрддреЗ: рддреА рд▓рд┐рд╣рд╛, рддрд┐рд▓рд╛ рдЬреБрдиреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдЪрд┐рдареНрдареАрдХрдбреЗ рджрд╛рдЦрд╡рд╛, рдЭрд╛рд▓реЗ тАФ рдХреЛрдгреАрд╣реА рд╕рд░рдХрдд рдирд╛рд╣реА.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
  H["head"] --> A["Aishwarya ┬╖ next"] --> S["Katrina ┬╖ next"] --> K["Dipika ┬╖ next"] --> M["Meera ┬╖ next"] --> N["None"]

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

queues, LRU caches, adjacency lists рдЖрдгрд┐ memory allocators linked lists рд╡рд╛рдкрд░реВрдирдЪ рдмрдирд╡рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд, рдЖрдгрд┐ рддреАрди pointers рдбреЛрдХреНрдпрд╛рдд рдзрд░реВрди рдареЗрд╡рддрд╛ рдпреЗрддрд╛рдд рдХрд╛ рдпрд╛рдЪреА reversal рд╣реА рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд░реАрдХреНрд╖рд╛ рдЖрд╣реЗ. linked list рдХрдзреА рд╡рд╛рдкрд░реВ рдирдпреЗ (Python рдордзреНрдпреЗ рдЬрд╡рд│рдЬрд╡рд│ рдиреЗрд╣рдореАрдЪ) рд╣реЗ рдорд╛рд╣реАрдд рдЕрд╕рдгреЗ рд╣рд╛ рджреБрд╕рд░рд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

push_front Node(value, self.head) рддрдпрд╛рд░ рдХрд░рддреЛ; find рдХрд┐рддреА рдЪрд┐рдареНрдареНрдпрд╛рдВрдорд╛рдЧреЗ рдЧреЗрд▓рд╛ рддреЗ рдореЛрдЬрддреЛ; reverse рдореНрд╣рдгрдЬреЗ рддреАрди-pointer loop, рд╕рд╣рд╛ рдУрд│реА.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 dsa/demo.py linked
python3 - <<'EOF'
import sys; sys.path.insert(0, "dsa"); from structures import LinkedList
ll = LinkedList()
for x in range(5, 0, -1): ll.push_front(x)
print(ll.to_list(), "find 4 in", ll.find(4), "steps")
ll.reverse(); print(ll.to_list())
# a deque does the same job at work:
from collections import deque; d = deque([1, 2, 3]); d.appendleft(0); d.pop(); print(d)
EOF

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

['Aishwarya', 'Katrina', 'Dipika', 'Meera', 'Rohan'], 2 рдЪрд┐рдареНрдареНрдпрд╛рдВрдирдВрддрд░ find 'Katrina', рд╕рдЧрд│реНрдпрд╛ 5 рдкрд╛рд░ рдХреЗрд▓реНрдпрд╛рд╡рд░ find 'Zoya' = -1, рдЖрдгрд┐ рдЙрд▓рдЯреА рдХреЗрд▓реЗрд▓реА list. рддреБрдордЪреА рд╕реНрд╡рддрдГрдЪреА list [1, 2, 3, 4, 5] print рдХрд░рддреЗ, 4 рд╣реЗ 4 steps рдордзреНрдпреЗ рд╢реЛрдзрддреЗ, рдордЧ рдЙрд▓рдЯреА рд╣реЛрддреЗ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рддреБрдореНрд╣реА рдлрдХреНрдд nodes рдЖрдгрд┐ pointers рдкрд╛рд╕реВрди list рдмрдирд╡рд▓реА, O(1) insertion рдЖрдгрд┐ O(n) search рдкрд╛рд╣рд┐рд▓реЗ, рдЖрдгрд┐ рдЬрд╛рд╕реНрддреАрдЪреНрдпрд╛ memory рд╢рд┐рд╡рд╛рдп рддреА рдЙрд▓рдЯреА рдХреЗрд▓реА.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рддреБрдордЪреНрдпрд╛ database рд╕рдореЛрд░рдЪрд╛ LRU cache рдореНрд╣рдгрдЬреЗ hash map рдЖрдгрд┐ doubly linked list; OS scheduler рдЪреА run queue рдЖрдгрд┐ memory allocator рдордзрд▓реА free-list рдпрд╛ linked lists рдЖрд╣реЗрдд. рддреБрдореНрд╣реА рддреНрдпрд╛ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рд╡рд╛рдЪрд╛рд▓ рдЬрд╛рд╕реНрдд.

тПня╕П рдкреБрдвреЗ

рдзрдбрд╛ 04 тАФ stacks рдЖрдгрд┐ queues: рдЯреНрд░реЗрдЪреА рдЪрд│рдд рдЖрдгрд┐ рдЬреЗрд╡рдгрд╛рдЪреА рд░рд╛рдВрдЧ, рдЖрдгрд┐ list.pop(0) рд╣рд╛ рд╕рд╛рдкрд│рд╛ рдХрд╛ рдЖрд╣реЗ.

ЁЯз╡ Lesson 03 тАФ Linked lists: the treasure hunt

ЁЯУН You are here: Lesson 03 of 12 ┬╖ Next: lesson-04-stacks-queues


ЁЯУж What's in this branch

Lessons 01тАУ03. The structure that wins exactly the operation arrays lose тАФ and the in-place reversal every interviewer asks for.

ЁЯзТ Explain like I'm 5

No lockers this time тАФ a treasure hunt. Each note holds a name and says where the next note is. To reach the fourth note you must read the first three; there is no "note number 17". But adding a note at the start is instant: write it, point it at the old first note, done тАФ nobody shifts.

ЁЯЧ║я╕П Diagram

flowchart LR
  H["head"] --> A["Aishwarya ┬╖ next"] --> S["Katrina ┬╖ next"] --> K["Dipika ┬╖ next"] --> M["Meera ┬╖ next"] --> N["None"]

тЭУ What

ЁЯдФ Why

Linked lists are how queues, LRU caches, adjacency lists and memory allocators are built, and the reversal is the classic test of whether you can hold three pointers in your head. Knowing when not to use one (almost always, in Python) is the other half.

ЁЯФз How (in this repo)

push_front creates Node(value, self.head); find counts how many notes it followed; reverse is the three-pointer loop, six lines.

ЁЯзк Try it

python3 dsa/demo.py linked
python3 - <<'EOF'
import sys; sys.path.insert(0, "dsa"); from structures import LinkedList
ll = LinkedList()
for x in range(5, 0, -1): ll.push_front(x)
print(ll.to_list(), "find 4 in", ll.find(4), "steps")
ll.reverse(); print(ll.to_list())
# a deque does the same job at work:
from collections import deque; d = deque([1, 2, 3]); d.appendleft(0); d.pop(); print(d)
EOF

тЬЕ Verify тАФ what you should see

['Aishwarya', 'Katrina', 'Dipika', 'Meera', 'Rohan'], find 'Katrina' after 2 notes, find 'Zoya' = -1 after walking all 5, and the reversed list. Your own list prints [1, 2, 3, 4, 5], finds 4 in 4 steps, then reverses.

ЁЯПБ What you just proved

You built a list from nothing but nodes and pointers, watched O(1) insertion and O(n) search, and reversed it without extra memory.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: the LRU cache in front of your database is a hash map plus a doubly linked list; the OS scheduler's run queue and the free-list in a memory allocator are linked lists. You will read them more than write them.

тПня╕П Next

Lesson 04 тАФ stacks & queues: the tray pile and the lunch line, and why list.pop(0) is a trap.

тЖР PreviousarraysNext тЖТstacks queues

This page is the lesson's README from the lesson-03-linked-lists branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.