Zig Academy · บทเรียน

รายการเชื่อมโยงทางเดียว

โหนด การเป็นเจ้าของ และการไล่สำรวจ

บทเรียน 2 จาก 413 ขั้นตอน

รายการเชื่อมโยงทางเดียว เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สแตกแบบทั่วไปตั้งแต่เริ่มต้น
  2. รายการเชื่อมโยงทางเดียว
  3. การใช้ HashMap และ AutoHashMap
  4. การวิเคราะห์ประสิทธิภาพและข้อแลกเปลี่ยนด้านความปลอดภัย
← กลับไปที่ Zig Academy