รายการเชื่อมโยงทางเดียว
โหนด การเป็นเจ้าของ และการไล่สำรวจ
รายการเชื่อมโยงทางเดียว เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
ลิงก์ลิสต์คืออะไร
ลิงก์ลิสต์แบบทางเดียวเชื่อมค่าต่าง ๆ เข้าด้วยกัน: แต่ละ โหนดเก็บค่าและพอยน์เตอร์ไปยังโหนดถัดไป หรือเก็บค่า null เมื่อถึงจุดสิ้นสุด 🔗
กำหนด Node
โหนดคือโครงสร้างที่มีค่าและพอยน์เตอร์แบบ ออปชันนัลไปยังโหนดถัดไป ออปชันนัลหมายความว่าโหนดสุดท้ายจะชี้ไปที่ null
const Node = struct {
value: i32,
next: ?*Node,
};เหตุใดพอยน์เตอร์จึงเป็นออปชันนัล
การใช้ ?*Node ช่วยให้สายโซ่สิ้นสุดอย่างปลอดภัย คุณไม่จำเป็นต้องใช้ค่าพิเศษเพื่อทำเครื่องหมายส่วนท้าย
next: ?*Nodeลิสต์ติดตามโหนดแรก
ตัวลิสต์เองเพียงจดจำโหนดแรก ซึ่งเรียกว่า ส่วนหัว รวมถึงตัวจัดสรรที่เป็นเจ้าของโหนดทั้งหมด
const List = struct {
head: ?*Node,
alloc: std.mem.Allocator,
};จัดสรรโหนดหนึ่งรายการ
หากต้องการเพิ่มค่า ให้ขอให้ตัวจัดสรร create Node หนึ่งรายการบนฮีป การดำเนินการนี้จะส่งคืนพอยน์เตอร์ไปยังพื้นที่จัดเก็บใหม่
const node = try self.alloc.create(Node);เพิ่มที่ด้านหน้า
การแทรกที่มีต้นทุนต่ำที่สุดคือการแทรกที่ส่วนหัว: ให้โหนดใหม่ชี้ไปยังส่วนหัวเดิม แล้วกำหนดให้โหนดใหม่นั้นเป็น ส่วนหัว ใช้เวลาคงที่
node.* = .{ .value = v, .next = self.head };
self.head = node;เดินไปตามสายโซ่
หากต้องการสำรวจ ให้เริ่มที่ส่วนหัวและติดตามพอยน์เตอร์ next แต่ละรายการจนถึง null ลูป while เหมาะสำหรับเก็บโหนดระหว่างการเดินสำรวจ
var cur = self.head;
while (cur) |n| {
std.debug.print("{d}\n", .{n.value});
cur = n.next;
}การจับค่าจะคลายออปชันนัล
การเขียน while (cur) |n| จะทำงานในบอดีตราบใดที่ cur ไม่ใช่ null และ n คือพอยน์เตอร์ที่ถูกคลายค่าแล้ว ลูปจะจบลงเมื่อพบ null
while (cur) |n| { ... }คุณเป็นเจ้าของทุกโหนด
โหนดแต่ละรายการมาจากตัวจัดสรร ดังนั้นต้องคืนทุกโหนด การลืมแม้แต่รายการเดียวก็คือ หน่วยความจำรั่ว ซึ่งตัวจัดสรรสำหรับการทดสอบจะแจ้งให้ทราบ
คืนหน่วยความจำของทั้งลิสต์
เดินไปตามสายโซ่ใน deinit แต่ต้องเก็บค่า next ไว้ก่อนคืนหน่วยความจำ เพราะโหนดจะหายไปทันทีที่คุณทำลายมัน
var cur = self.head;
while (cur) |n| {
const nxt = n.next;
self.alloc.destroy(n);
cur = nxt;
}ทำให้เป็นแบบทั่วไป
ห่อ Node และ List ไว้ในฟังก์ชันที่ส่งคืนชนิดข้อมูล เพื่อให้ลิสต์รองรับ ชนิดสมาชิกใดก็ได้ ไม่ใช่แค่ i32
fn LinkedList(comptime T: type) type {
return struct {
const Node = struct { value: T, next: ?*Node };
};
}ตรวจสอบอย่างรวดเร็ว
คุณกำลังคืนหน่วยความจำของโหนดในลิงก์ลิสต์ทีละรายการ ก่อนทำลายแต่ละโหนด คุณต้องทำอะไร
สรุป
โหนดเก็บค่าและพอยน์เตอร์ next แบบออปชันนัล ลิสต์ติดตามส่วนหัวและตัวจัดสรร เพิ่มรายการที่ด้านหน้า และคืนหน่วยความจำทีละโหนด 🎯
เรียนรู้ Zig ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “รายการเชื่อมโยงทางเดียว” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รายการเชื่อมโยงทางเดียว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รายการเชื่อมโยงทางเดียว”
โหนด การเป็นเจ้าของ และการไล่สำรวจ คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “รายการเชื่อมโยงทางเดียว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม
ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สแตกแบบทั่วไปตั้งแต่เริ่มต้น
- รายการเชื่อมโยงทางเดียว
- การใช้ HashMap และ AutoHashMap
- การวิเคราะห์ประสิทธิภาพและข้อแลกเปลี่ยนด้านความปลอดภัย