40 คำถามและคำตอบสัมภาษณ์เกี่ยวกับ Linked List ยอดนิยม (2026)
การเตรียมตัวสำหรับการสัมภาษณ์งานด้านโครงสร้างข้อมูลนั้นจำเป็นต้องมุ่งเน้นไปที่ความท้าทาย คำถามสัมภาษณ์เกี่ยวกับ Linked List จะเผยให้เห็นถึงความสามารถในการแก้ปัญหาอย่างลึกซึ้ง ตรรกะของตัวชี้ ความเข้าใจเรื่องหน่วยความจำ และวิธีที่ผู้สมัครใช้เหตุผลในการแก้ปัญหาในกรณีพิเศษต่างๆ
การเชี่ยวชาญโครงสร้างข้อมูลแบบ Linked List จะเปิดโอกาสในการทำงานในทีมพัฒนาผลิตภัณฑ์ แพลตฟอร์ม และวิศวกรรมระบบ การได้รับประสบการณ์จริงจะช่วยสร้างความเชี่ยวชาญทางเทคนิคที่แข็งแกร่ง การคิดวิเคราะห์ และนิสัยการเขียนโค้ดที่ดี ทักษะนี้ช่วยสนับสนุนการทำงานตั้งแต่ระดับเริ่มต้นจนถึงระดับมืออาชีพอาวุโส ทั้งการแก้ไขข้อผิดพลาด การวิเคราะห์ประสิทธิภาพ การให้คำแนะนำแก่ผู้ใต้บังคับบัญชา และการทำงานร่วมกับผู้จัดการในการสร้างโซลูชันที่ปรับขนาดได้โดยใช้แนวคิดขั้นสูงจากประสบการณ์ อ่านเพิ่มเติม ...
👉 ดาวน์โหลดไฟล์ PDF ฟรี: คำถามและคำตอบสำหรับการสัมภาษณ์เกี่ยวกับโครงสร้างข้อมูลแบบ Linked List
คำถามและคำตอบสัมภาษณ์ยอดนิยม (มีลิงก์ไปยังคำถามและคำตอบ)
1) อธิบายว่า Linked List คืออะไร และแตกต่างจาก Array อย่างไร
A รายการที่เชื่อมโยง ลิงก์ลิสต์เป็นโครงสร้างข้อมูลเชิงเส้นที่องค์ประกอบซึ่งเรียกว่าโหนดเชื่อมต่อกันโดยใช้ตัวชี้หรือการอ้างอิง แต่ละโหนดประกอบด้วยข้อมูลและตัวชี้/การอ้างอิงไปยังโหนดถัดไปในรายการ แตกต่างจากอาร์เรย์ ลิงก์ลิสต์ไม่ได้จัดเก็บองค์ประกอบในหน่วยความจำที่ต่อเนื่องกัน
ความแตกต่างที่สำคัญระหว่างลิสต์เชื่อมโยงและอาร์เรย์:
| ลักษณะ | รายการที่เชื่อมโยง | แถว |
|---|---|---|
| การจัดสรรหน่วยความจำ | พลวัต | คงที่ |
| เวลาเข้าถึงองค์ประกอบ | O (n) | O (1) |
| การแทรก/การลบ | มีประสิทธิภาพ (ไม่ว่าจะอยู่ในตำแหน่งใด) | มีราคาแพง (ต้องมีการเคลื่อนย้าย) |
| โอเวอร์เฮดหน่วยความจำ | พื้นที่เพิ่มเติมสำหรับตัวชี้ | ไม่มีค่าใช้จ่ายเพิ่มเติมสำหรับตัวชี้ |
โดยสรุปแล้ว ลิสต์แบบเชื่อมโยงมีข้อดีคือ การแทรกข้อมูลเร็วขึ้นและการปรับขนาดแบบไดนามิก แต่ข้อเสียคือ การเข้าถึงข้อมูลแบบสุ่มช้าลง และต้องใช้หน่วยความจำเพิ่มขึ้นเนื่องจากตัวชี้
2) ลิงก์ลิสต์มีกี่ประเภท?
มี รายการเชื่อมโยงหลายประเภทและผู้สัมภาษณ์มักขอให้คุณแยกแยะความแตกต่างระหว่างสิ่งเหล่านี้:
- รายการเชื่อมโยงเดี่ยว: แต่ละโหนดจะชี้ไปยังโหนดถัดไปเท่านั้น
- รายการที่เชื่อมโยงทวีคูณ: โหนดมี สองพอยเตอร์: หนึ่งไปยังโหนดถัดไป และหนึ่งไปยังโหนดก่อนหน้า
- รายการเชื่อมโยงแบบวงกลม: โหนดสุดท้ายชี้กลับไปยังโหนดแรก ทำให้เกิดเป็นวงวน
- รายการเชื่อมโยงแบบวงกลมสองทาง: เป็นการผสมผสานระหว่างลิสต์แบบวงกลมและลิสต์แบบเชื่อมโยงสองทาง
โครงสร้างข้อมูลแต่ละประเภทมีกรณีการใช้งานที่แตกต่างกันไป ขึ้นอยู่กับการเข้าถึงข้อมูลและความต้องการหน่วยความจำ ตัวอย่างเช่น โครงสร้างข้อมูลแบบลิสต์เชื่อมโยงสองทิศทางช่วยให้เข้าถึงข้อมูลย้อนกลับได้ง่าย แต่ต้องแลกมาด้วยการใช้พอยเตอร์เพิ่มเติม
3) จะกลับลำดับของลิสต์เชื่อมโยงเดี่ยวได้อย่างไร (วิธีการเขียนโค้ด)
Revการเรียงลำดับใหม่ของลิสต์แบบเชื่อมโยงเป็นคำถามสัมภาษณ์คลาสสิก เป้าหมายคือการเปลี่ยนทิศทางของตัวชี้เพื่อให้ลิสต์กลับด้านโดยไม่ต้องสร้างโหนดใหม่
แนวคิดหลัก:
ใช้ตัวชี้สามตัว — prev, currและ next — และวนซ้ำไปตามรายการ ในแต่ละขั้นตอน ให้เปลี่ยนเส้นทางใหม่ curr.next ไปยัง prevจากนั้นเลื่อนตัวชี้ทั้งหมดไปข้างหน้า
ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev; // New head
}
สิ่งนี้จะแปลงโครงสร้างที่เชื่อมโยงโดยไม่ต้องใช้พื้นที่เพิ่มเติมและทำงานได้ O (n) เวลา
4) อธิบายเทคนิคการใช้ตัวชี้สองตัวเพื่อหาจุดกึ่งกลางของรายการเชื่อมโยง (Linked List)
วิธีที่มีประสิทธิภาพที่สุดในการค้นหาโหนดตรงกลางของรายการเชื่อมโยงคือการใช้ตัวชี้สองตัว:
- A ตัวชี้ช้า ย้ายทีละโหนด
- A ตัวชี้เร็ว เคลื่อนย้ายโหนดสองโหนดในแต่ละครั้ง
เมื่อเข็มชี้เร็วไปถึงจุดสิ้นสุด เข็มชี้ช้าจะอยู่ที่จุดกึ่งกลาง เทคนิคนี้ทำงานในลักษณะ... O (n) เวลาโดยไม่ต้องใช้พื้นที่เพิ่มเติม
5) คุณจะตรวจจับวงจรใน Linked List ได้อย่างไร?
การตรวจจับวงจรเป็นปัญหาคลาสสิกอีกอย่างหนึ่ง วิธีแก้ปัญหามาตรฐานคือการใช้ อัลกอริทึมเต่าและกระต่ายของฟลอยด์:
- ย้าย
slow pointerหนึ่งขั้นในเวลา. - ย้าย
fast pointerทีละสองก้าว - ถ้าลิสต์มีวงจร ตัวชี้ทั้งสองจะมาบรรจบกัน
ถ้าตัวชี้เร็วไปถึง nullรายการดังกล่าวไม่มีวงจร วิธีนี้ทำงานใน O (n) เวลาและ O (1) ช่องว่าง
6) ข้อดีและข้อเสียของโครงสร้างข้อมูลแบบ Linked List มีอะไรบ้าง?
โครงสร้างข้อมูลแบบลิสต์เชื่อมโยงมีข้อดีและข้อเสียหลายประการ:
| ข้อดี | ข้อเสีย |
|---|---|
| ขนาดไดนามิก | ไม่มีการเข้าถึงแบบสุ่ม |
| ใส่/ลบได้ง่าย | หน่วยความจำเพิ่มเติมสำหรับตัวชี้ |
| มีประสิทธิภาพสำหรับการเพิ่มปริมาณข้อมูล | ประสิทธิภาพแคชต่ำ |
โครงสร้างข้อมูลแบบลิสต์เชื่อมโยง (Linked List) ทำงานได้ดีกับข้อมูลแบบไดนามิก แต่การเข้าถึงองค์ประกอบอาจช้ากว่าแบบอาร์เรย์ เนื่องจากแต่ละการเข้าถึงต้องเริ่มจากส่วนหัวของลิสต์
7) คุณจะรวมลิสต์เชื่อมโยงที่เรียงลำดับแล้วสองลิสต์เข้าด้วยกันได้อย่างไร?
การรวมลิสต์ที่เรียงลำดับแล้วสองลิสต์เข้าด้วยกันเป็นอีกหนึ่งปัญหาที่พบบ่อยในการสัมภาษณ์งาน แนวคิดคือการวนลูปผ่านทั้งสองลิสต์พร้อมกันและสร้างลิสต์ที่เรียงลำดับใหม่โดยการเลือกโหนดที่เล็กที่สุดจากลิสต์ใดลิสต์หนึ่งในแต่ละขั้นตอน
ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
tail.next = l1;
l1 = l1.next;
} else {
tail.next = l2;
l2 = l2.next;
}
tail = tail.next;
}
tail.next = (l1 != null) ? l1 : l2;
return dummy.next;
}
วิธีการนี้จะรักษาลำดับที่เรียงไว้และทำงานได้ใน โอ(น + ม) ถึงเวลาสำหรับรายการที่มีความยาว n และ m แล้ว
8) อธิบายวิธีการลบโหนดที่ N จากส่วนท้ายของรายการเชื่อมโยง (Linked List)
เทคนิคที่มีประสิทธิภาพมากที่สุดคือการใช้ สองพอยเตอร์ แยกกันด้วยโหนด n โหนด เลื่อนตัวชี้ตัวแรกไปข้างหน้า n ขั้น จากนั้นเลื่อนตัวชี้ทั้งสองตัวจนกระทั่งตัวแรกไปถึงจุดสิ้นสุด ตัวชี้ตัวที่สองจะอยู่ก่อนโหนดเป้าหมายพอดี
วิธีนี้ช่วยหลีกเลี่ยงการคำนวณความยาวของรายการแยกต่างหากและเสร็จสมบูรณ์ในเวลาไม่นาน O (n) เวลา นอกจากนี้ยังจัดการกับกรณีพิเศษต่างๆ เช่น การลบโหนดแรกได้ด้วย
9) การเข้าถึงองค์ประกอบที่ k ในรายการเชื่อมโยงมีความซับซ้อนด้านเวลาเท่าใด?
การเข้าถึงไฟล์ kการเข้าถึงองค์ประกอบที่ th ในรายการเชื่อมโยงต้องใช้การวนซ้ำจากหัวรายการจนกว่าจะถึงองค์ประกอบที่ th kโหนดที่ th เนื่องจากรายการเชื่อมโยงไม่มีการจัดทำดัชนีโดยตรง จึงทำให้มีค่าใช้จ่าย O (n) ในกรณีที่เลวร้ายที่สุด อาจต้องใช้เวลาสักระยะ
ในทางตรงกันข้าม อาร์เรย์รองรับการจัดทำดัชนีโดยตรงใน O (1) เวลา
10) เหตุใดคุณจึงควรใช้ Linked List แทนที่จะใช้ Array?
โครงสร้างข้อมูลแบบลิสต์เชื่อมโยงมีประโยชน์อย่างยิ่งในกรณีต่อไปนี้:
- คุณคาดหวังว่าจะมีการแทรกและลบข้อมูลบ่อยครั้งในตำแหน่งที่ไม่แน่นอน
- คุณไม่ทราบขนาดของข้อมูลล่วงหน้า
- การแบ่งส่วนหน่วยความจำทำให้การจัดสรรหน่วยความจำอย่างต่อเนื่องทำได้ยาก
โครงสร้างข้อมูลแบบนี้รองรับการจัดสรรหน่วยความจำแบบไดนามิกที่มีประสิทธิภาพ และการแทรก/ลบข้อมูลที่จุดสิ้นสุดของรายการหรือด้วยการอ้างอิงโหนดที่ทราบได้ในเวลาคงที่ ซึ่งเป็นข้อดีที่อาร์เรย์ไม่สามารถเทียบได้
11) การใช้งานจริงของ Linked List มีอะไรบ้าง?
โครงสร้างข้อมูลแบบลิสต์เชื่อมโยง (Linked List) ถูกนำมาใช้กันอย่างแพร่หลายในระบบต่างๆ ที่ การจัดสรรหน่วยความจำแบบไดนามิก, การสอดใส่บ่อยครั้งหรือ โครงสร้างข้อมูลที่มีขนาดแปรผันได้ เป็นสิ่งที่จำเป็น โดยจะถูกนำไปใช้ในแนวคิดและแอปพลิเคชันหลักๆ ของวิทยาการคอมพิวเตอร์หลายประการ เช่น:
- การจัดการหน่วยความจำแบบไดนามิก (ใช้ในระบบปฏิบัติการ)
- ฟังก์ชันยกเลิก/ทำซ้ำ ในโปรแกรมแก้ไขข้อความ
- การเชื่อมโยงตารางแฮช เพื่อแก้ไขการชนกัน
- การนำทางเพลย์ลิสต์เพลงหรือวิดีโอ
- การแสดงความสัมพันธ์ของกราฟ
- การดำเนินการทางเลขคณิตของพหุนาม
ตัวอย่างเหล่านี้แสดงให้เห็นว่าลิสต์แบบเชื่อมโยงให้ความยืดหยุ่นและประสิทธิภาพในการจัดการลำดับข้อมูล ซึ่งการปรับขนาดของอาร์เรย์จะมีค่าใช้จ่ายสูง
12) อธิบายความแตกต่างระหว่างลิสต์เชื่อมโยงเดี่ยวและลิสต์เชื่อมโยงคู่
| ลักษณะ | รายการที่เชื่อมโยงเพียงรายการเดียว | รายการที่เชื่อมโยงเป็นสองเท่า |
|---|---|---|
| ชี้ | 1 (เฉพาะโหนดถัดไป) | 2 (ก่อนหน้าและถัดไป) |
| การข้ามผ่าน | ทิศทางเดียวเท่านั้น | ทั้งสองทิศทาง |
| ใช้หน่วยความจำ | Less (มีตัวชี้เพียงตัวเดียว) | เพิ่มเติม (ตัวชี้พิเศษ) |
| การลบ | ยากขึ้น (ต้องผ่านโหนดก่อนหน้า) | ง่ายดาย |
| ตัวอย่างการใช้งาน | การใช้งาน Stack | การนำทางประวัติการเข้าชมเว็บไซต์ |
A รายการที่เชื่อมโยงสองครั้ง ใช้งานได้หลากหลายกว่า แต่ใช้หน่วยความจำเพิ่มขึ้น ในทางตรงกันข้าม รายการที่เชื่อมโยงเดี่ยวๆ มีน้ำหนักเบาและมีประสิทธิภาพสำหรับการเคลื่อนที่แบบทิศทางเดียว
13) จะลบข้อมูลซ้ำออกจากรายการเชื่อมโยงที่เรียงลำดับแล้วได้อย่างไร?
เมื่อลิสต์แบบเชื่อมโยงได้รับการเรียงลำดับแล้ว ข้อมูลที่ซ้ำกันจะอยู่ติดกัน
วนลูปไปตามรายการและเปรียบเทียบข้อมูลของแต่ละโหนดกับโหนดถัดไป หากตรงกัน ให้ข้ามโหนดถัดไป
void removeDuplicates(ListNode head) {
ListNode current = head;
while (current != null && current.next != null) {
if (current.val == current.next.val) {
current.next = current.next.next;
} else {
current = current.next;
}
}
}
ซับซ้อน: เวลา O(n) และพื้นที่ O(1)
สำหรับลิสต์ที่ไม่ได้เรียงลำดับ สามารถใช้ HashSet เพื่อติดตามค่าที่ปรากฏได้
14) อะไรคือความแตกต่างระหว่างรายการเชื่อมโยงเชิงเส้นและรายการเชื่อมโยงแบบวงกลม?
| ลักษณะ | รายการเชื่อมโยงเชิงเส้น | รายการที่เชื่อมโยงแบบวงกลม |
|---|---|---|
| โหนดสุดท้าย | ชี้ไปยังค่าว่าง | ชี้ไปยังโหนดหัว |
| การข้ามผ่าน | สิ้นสุดเมื่อ next == NULL |
การสำรวจอย่างต่อเนื่อง |
| ใช้กรณี | สแต็ก, คิว | การจัดตารางแบบหมุนเวียน |
| ความซับซ้อน | เรียบง่ายขึ้น | การจัดการที่ซับซ้อนมากขึ้น |
รายการแบบวงกลมมีประโยชน์อย่างยิ่งในแอปพลิเคชันต่างๆ เช่น การจัดตารางการทำงานของ CPU ซึ่งกระบวนการต่างๆ จะถูกดำเนินการเป็นรอบๆ
15) คุณจะหาจุดตัดของลิสต์เชื่อมโยงสองลิสต์ได้อย่างไร?
เพื่อตรวจสอบว่าลิสต์เชื่อมโยงเดี่ยวสองลิสต์มีส่วนที่ทับซ้อนกันหรือไม่:
- จงหาความยาวของทั้งสองรายการ
- เลื่อนตัวชี้ของรายการที่ยาวกว่าไปตามผลต่างของความยาว
- วนลูปผ่านทั้งสองรายการพร้อมกันจนกว่าโหนดจะเหมือนกัน
อีกทางเลือกหนึ่งคือ แฮชเซ็ต สามารถใช้เพื่อจัดเก็บโหนดที่เยี่ยมชมแล้วโดยใช้พื้นที่ O(n)
วิธีการนี้มีประสิทธิภาพและมักถูกถามในการสัมภาษณ์งานระดับสูง
16) คุณจะตรวจสอบได้อย่างไรว่าลิสต์เชื่อมโยงสองลิสต์นั้นเหมือนกันหรือไม่?
รายการเชื่อมโยงสองรายการจะเหมือนกันก็ต่อเมื่อ:
- พวกมันมีจำนวนโหนดเท่ากัน
- ค่าของโหนดที่สอดคล้องกันนั้นเรียงลำดับเหมือนกัน
ขั้นตอนวิธีการ:
- เรียกดูทั้งสองรายการพร้อมกัน
- เปรียบเทียบข้อมูลของแต่ละโหนด
- ถ้าคู่ทั้งหมดตรงกันและทั้งคู่ได้ค่าเป็น NULL แสดงว่าคู่เหล่านั้นเหมือนกัน
ความซับซ้อนเชิงเวลา: O (n)
ความซับซ้อนของพื้นที่: O (1)
17) ในบริบทของลิสต์แบบเชื่อมโยง การรั่วไหลของหน่วยความจำคืออะไร?
A หน่วยความจำรั่ว เกิดขึ้นเมื่อโหนดที่จัดสรรแบบไดนามิกไม่ได้รับการปล่อยคืนหลังจากใช้งานเสร็จ
ในลิสต์แบบเชื่อมโยง ถ้า delete or free() หากฟังก์ชันนี้ไม่ถูกเรียกใช้กับโหนดที่ถูกลบออกจากรายการ หน่วยความจำจะยังคงถูกใช้งานอยู่แม้ว่าจะไม่สามารถเข้าถึงได้อีกต่อไปแล้วก็ตาม
ตัวอย่างเช่น การไม่ปล่อยโหนดที่ถูกลบใน C/C++ ส่งผลให้หน่วยความจำหมดลงทีละน้อย ทำให้ระบบทำงานช้าลงหรือเกิดการขัดข้อง
การจัดการล้างข้อมูลอย่างถูกต้องโดยใช้ destructor หรือการปลดปล่อยหน่วยความจำอย่างชัดเจนจะช่วยหลีกเลี่ยงปัญหานี้ได้
18) อธิบายวิธีการสร้างโครงสร้างข้อมูลแบบ Stack โดยใช้ Linked List
ใน กองโดยองค์ประกอบต่างๆ จะถูกจัดเรียงตามลำดับ LIFO (Last In, First Out)
โครงสร้างข้อมูลแบบลิสต์เชื่อมโยง (Linked List) เหมาะอย่างยิ่ง เพราะการแทรกและการลบข้อมูลเกิดขึ้นที่ส่วนหัวของลิสต์อย่างมีประสิทธิภาพ
Operaชั่น:
- ผลักดัน: แทรกโหนดใหม่ที่ส่วนหัว
- โผล่: ลบโหนดออกจากส่วนหัว
- แอบมอง: ส่งข้อมูลส่วนหัวกลับมา
ข้อดี:
ไม่จำเป็นต้องกำหนดขนาดของอาร์เรย์ตายตัว อาร์เรย์จะขยายขนาดได้เองเมื่อมีการเพิ่มองค์ประกอบเข้าไป
19) เราสามารถใช้ลิสต์เชื่อมโยงเพื่อสร้างคิวได้อย่างไร?
ใน คิวองค์ประกอบต่างๆ จะถูกจัดเรียงตามลำดับ FIFO (First In, First Out)
ใช้โครงสร้างข้อมูลแบบลิสต์เชื่อมโยงในกรณีที่:
- เพิ่มลงในคิว (แทรก): เพิ่มโหนดที่ส่วนท้าย
- ลบออกจากคิว (Dequeue): ลบโหนดออกจากส่วนหัว
ซึ่งช่วยให้สามารถดำเนินการทั้งสองอย่างได้ใน O (1) เวลาพร้อมตัวชี้สองตัว — front และ rear.
โดยทั่วไปจะใช้ในระบบการจัดตารางงานและระบบคิวเครื่องพิมพ์
20) ความแตกต่างระหว่างอาร์เรย์ลิสต์และลิงก์ลิสต์มีอะไรบ้าง Java?
| แง่มุม | รายการอาร์เรย์ | รายการที่เชื่อมโยง |
|---|---|---|
| พื้นที่จัดเก็บ | อาร์เรย์ไดนามิก | รายการที่เชื่อมโยงแบบคู่ |
| เวลาเข้าถึง | O (1) | O (n) |
| แทรก/ลบ | ราคาแพงในระดับกลาง | มีประสิทธิภาพที่ปลายสุด |
| โอเวอร์เฮดหน่วยความจำ | Less | เพิ่มเติม (คำแนะนำเพิ่มเติม) |
| ใช้กรณี | การเข้าถึงบ่อยครั้ง | การแทรก/ลบข้อมูลบ่อยครั้ง |
ตัวอย่าง: ใช้ ArrayList สำหรับการดำเนินการที่ต้องค้นหาข้อมูลจำนวนมาก และ LinkedList เมื่อการดำเนินการแทรก/ลบข้อมูลมีบทบาทสำคัญ
21) จะแปลงโครงสร้างข้อมูลแบบลิสต์เชื่อมโยงหลายระดับให้แบนราบได้อย่างไร?
A รายการเชื่อมโยงหลายระดับ อาจมีโหนดที่มีทั้งสองอย่าง next และ child ตัวชี้ (แต่ละตัวชี้ไปยังรายการเชื่อมโยงอื่น) เป้าหมายคือการรวมโหนดทั้งหมดเข้าเป็นรายการเชื่อมโยงระดับเดียว
วิธีการ:
- ใช้ กอง or ฟังก์ชันเรียกซ้ำ.
- เริ่มจากโหนดหัว
- ถ้าโหนดมี
childผลักมันnextเพิ่มโหนดลงในสแต็ก และสร้างchildasnext. - ทำเช่นนี้ต่อไปจนกว่ากองจะว่างเปล่า
ความซับซ้อนของเวลา: O (n)
ความซับซ้อนของอวกาศ: O(n) สำหรับการเรียกซ้ำ/สแต็ก
ตัวอย่าง (ในเชิงแนวคิด):
1 - 2 - 3
|
4 - 5
Flattened → 1 → 2 → 4 → 5 → 3
คำถามนี้ประเมินความเข้าใจของคุณเกี่ยวกับการเรียกซ้ำและการจัดการตัวชี้
22) จะทำการโคลนลิสต์แบบเชื่อมโยงที่มีตัวชี้แบบสุ่มได้อย่างไร?
แต่ละโหนดในรายการเชื่อมโยงแบบพิเศษนี้มีตัวชี้สองตัว:
next→ ชี้ไปยังโหนดถัดไปrandom→ ชี้ไปยังโหนดใดๆ ก็ได้
อัลกอริทึม (3 ขั้นตอน):
- แทรกโหนดที่โคลนแล้วระหว่างโหนดเดิม
- กำหนดตัวชี้แบบสุ่มให้กับโคลน (
clone.random = original.random.next). - แยกรายการทั้งสองออกจากกัน
วิธีนี้ช่วยประหยัดพื้นที่สำหรับแผนที่แฮชและทำงานได้ในเวลาอันสั้น O (n) เวลาด้วย O (1) พื้นที่ว่างเพิ่มเติม
ใช้กรณี: การคัดลอกข้อมูลโครงสร้างที่ซับซ้อนแบบลึก (เช่น กราฟหรือการอ้างอิงวัตถุ)
23) สคิปลิสต์คืออะไร และมีความเกี่ยวข้องกับลิงค์ลิสต์อย่างไร?
A รายการข้าม เป็นโครงสร้างรายการเชื่อมโยงแบบหลายชั้นที่ช่วยให้ค้นหา แทรก และลบข้อมูลได้อย่างรวดเร็ว (คล้ายกับต้นไม้สมดุล)
| Operaการ | เวลาเฉลี่ย | กรณีที่เลวร้ายที่สุด |
|---|---|---|
| ค้นหา | O (บันทึก n) | O (n) |
| แทรก/ลบ | O (บันทึก n) | O (n) |
โครงสร้างนี้ประกอบด้วยหลายระดับ โดยระดับบนจะ "ข้าม" โหนดหลายโหนด ทำให้ประสิทธิภาพการค้นหาดีขึ้น
ตัวอย่าง: ใช้ในฐานข้อมูล เช่น Redis และการใช้งาน map แบบพร้อมกัน
24) คุณจะตรวจจับพาลินโดรมในรายการเชื่อมโยงได้อย่างไร?
โครงสร้างข้อมูลแบบลิสต์เชื่อมโยง (linked list) เรียกว่า พาลินโดรม (palindrome) ถ้าสามารถอ่านได้เหมือนกันทั้งจากหน้าไปหลังและจากหลังไปหน้า
ขั้นตอนวิธีการ:
- หาค่าตรงกลางของรายการ
- Revเอาชนะในครึ่งหลัง
- เปรียบเทียบทั้งสองส่วนทีละจุด
ถ้าโหนดที่ตรงกันทั้งหมดตรงกัน ก็จะเป็นคำพาลินโดรม
ตัวอย่าง:
1 → 2 → 3 → 2 → 1 → ✅ พาลินโดรม
1 → 2 → 3 → 4 → ❌ ไม่ใช่พาลินโดรม
ความซับซ้อนของเวลา: O (n)
ความซับซ้อนของอวกาศ: O (1)
25) จะลบวงวนในรายการเชื่อมโยงได้อย่างไร?
หากพบวงวน (โดยใช้การตรวจจับวงวนของ Floyd) ให้ลบออกโดยใช้ขั้นตอนต่อไปนี้:
- ตรวจจับจุดบรรจบกันของตัวชี้แบบช้าและแบบเร็ว
- เลื่อนตัวชี้เมาส์หนึ่งตัวไปที่ส่วนหัว
- เลื่อนตัวชี้ทั้งสองทีละขั้นจนกระทั่งมาบรรจบกันที่ โหนดเริ่มต้นลูป.
- ตั้งค่าโหนดก่อนหน้า
nextไปยังnull.
วิธีการนี้ช่วยให้มั่นใจได้ว่าจะไม่มีการใช้หน่วยความจำเพิ่มเติมในระหว่างการแก้ไขวงจร
26) มีวิธีใดบ้างในการแสดงโครงสร้างข้อมูลแบบลิสต์เชื่อมโยงในหน่วยความจำ?
รายการเชื่อมโยงสามารถแสดงได้ในรูปแบบ สามวิธีหลัก:
| ประเภทการแสดงผล | Descriptไอออน | ตัวอย่างการใช้งาน |
|---|---|---|
| โหนดไดนามิก | แต่ละโหนดได้รับการจัดสรรและเชื่อมโยงแบบไดนามิก | C, C++ |
| การแสดงอาร์เรย์แบบคงที่ | ใช้ดัชนีของอาร์เรย์แทนตัวชี้ | ระบบฝังตัว |
| วัตถุที่เชื่อมโยง | การแสดงผลเชิงวัตถุด้วยคลาส | Java, Python |
แต่ละวิธีเหมาะสมกับสภาพแวดล้อมที่แตกต่างกัน ตัวอย่างเช่น รายการแบบอาร์เรย์จะใช้เมื่อการจัดการตัวชี้มีข้อจำกัด
27) คุณจะหาความยาวของรายการเชื่อมโยง (linked list) ได้อย่างไร (ทั้งแบบวนซ้ำและแบบเรียกซ้ำ)?
วิธีการทำซ้ำ:
int getLength(ListNode head) {
int count = 0;
while (head != null) {
count++;
head = head.next;
}
return count;
}
วิธีการแบบเรียกซ้ำ:
int getLength(ListNode head) {
if (head == null) return 0;
return 1 + getLength(head.next);
}
ทั้งสองแนวทางมี O (n) ความซับซ้อนของเวลา; การเรียกซ้ำเพิ่มความซับซ้อน O (n) ค่าใช้จ่ายด้านพื้นที่เนื่องจากลำดับการเรียก (call stack)
28) จงอธิบายแนวคิดของลิสต์เชื่อมโยงสองทางแบบวงกลม พร้อมยกตัวอย่างประกอบ
ใน รายการเชื่อมโยงสองทางแบบวงกลมแต่ละโหนดจะมีลิงก์สองลิงก์ — ลิงก์หนึ่งเชื่อมไปยังโหนดถัดไป และอีกลิงก์หนึ่งเชื่อมไปยังโหนดก่อนหน้า — และโหนดสุดท้าย next ชี้ไปที่หัว ในขณะที่หัว prev ชี้ไปยังโหนดสุดท้าย
ตัวอย่างการใช้งานกรณี:
- ระบบปฏิบัติการแบบเรียลไทม์ (การจัดตารางงานแบบราวด์โรบิน)
- การเล่นเพลย์ลิสต์เพลงวนซ้ำ
- การนำทางระหว่างแท็บหรือสไลด์
ข้อดี:
- การเดินทางแบบสองทิศทาง
- ไม่มีการอ้างอิงที่เป็นค่าว่าง
- การแทรกและการลบที่มีประสิทธิภาพ
29) จะลบโหนดสลับในรายการเชื่อมโยงได้อย่างไร?
ขั้นตอนวิธีการ:
- เริ่มจากศีรษะก่อน
- ลบโหนดที่สองทุกโหนดโดยการปรับตัวชี้
- ทำเช่นนี้ต่อไปจนกว่ารายการจะสิ้นสุด
ตัวอย่าง:
Input: 1 → 2 → 3 → 4 → 5 Output: 1 → 3 → 5
ซับซ้อน:
- เวลา: O(n)
- พื้นที่: O(1)
แบบทดสอบนี้จะตรวจสอบความเข้าใจเกี่ยวกับการเข้าถึงข้อมูลผ่านตัวชี้และความปลอดภัยในการลบข้อมูล
30) คุณจะหาโหนดที่ n จากจุดเริ่มต้นและจากจุดสิ้นสุดของรายการเชื่อมโยงได้อย่างไร?
ตั้งแต่เริ่มต้น: วนลูปไปตามรายการจนกว่าจำนวนจะเท่ากับ n
จากตอนจบ: ใช้ตัวชี้สองตัว
- เลื่อนตัวชี้ตัวแรกไปข้างหน้า n ขั้น
- เลื่อนทั้งสองอย่างพร้อมกันจนกว่าตัวแรกจะถึงค่าว่าง
- ตอนนี้ตัวชี้ตัวที่สองชี้ไปยังโหนดที่ n จากท้ายสุดแล้ว
ความซับซ้อนของเวลา: O (n)
ความซับซ้อนของอวกาศ: O (1)
วิธีนี้ช่วยหลีกเลี่ยงการคำนวณความยาวแยกต่างหาก ซึ่งช่วยเพิ่มประสิทธิภาพ
31) คุณจะจัดเรียงลำดับใหม่ของลิสต์แบบเชื่อมโยงได้อย่างไร?
ปัญหา: กำหนดให้ลิสต์หนึ่งรายการ L0 → L1 → … → Ln-1 → Lnเรียงลำดับใหม่ดังนี้ L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
ขั้นตอน:
- หาค่าตรงกลางของรายการ
- Revเอาชนะในครึ่งหลัง
- นำทั้งสองส่วนมาผสานเข้าด้วยกันสลับกันไป
ตัวอย่าง:
Input: 1 → 2 → 3 → 4 → 5 Output: 1 → 5 → 2 → 4 → 3
ซับซ้อน: เวลา O(n) พื้นที่ O(1)
นี่เป็นการทดสอบการดำเนินการกับโครงสร้างข้อมูลแบบเชื่อมโยงหลายอย่างในคำถามเดียว
32) คุณจะแบ่งรายการเชื่อมโยงตามค่า x ที่กำหนดให้ได้อย่างไร?
วัตถุประสงค์:
จัดเรียงโหนดใหม่เพื่อให้โหนดทั้งหมดที่มีค่าน้อยกว่า x อยู่ก่อนโหนดที่มีค่ามากกว่าหรือเท่ากับ x
วิธีการ:
- สร้างรายการจำลองสองรายการ:
beforeและafter. - วนลูปผ่านรายการต้นฉบับและเพิ่มโหนดลงในรายการที่เกี่ยวข้อง
- นำมารวมกันในตอนท้าย
ตัวอย่าง:
Input: 3 → 5 → 8 → 5 → 10 → 2 → 1, x = 5 Output: 3 → 2 → 1 → 5 → 8 → 5 → 10
คำถามนี้มักถูกถามเพื่อประเมินความสามารถในการจัดเรียงข้อมูลใหม่
33) คุณจะเรียงลำดับลิสต์แบบเชื่อมโยงได้อย่างไร?
เนื่องจากโครงสร้างข้อมูลแบบลิงก์ลิสต์ไม่รองรับการเข้าถึงแบบสุ่ม ผสานการเรียง เป็นตัวเลือกที่ดีที่สุด
ขั้นตอน:
- แบ่งรายการออกเป็นสองส่วนโดยใช้ตัวชี้แบบช้า/เร็ว
- เรียงลำดับแต่ละครึ่งโดยใช้การเรียกซ้ำ
- รวมครึ่งที่เรียงลำดับแล้วเข้าด้วยกัน
ข้อดี:
- เวลา O(n log n)
- พื้นที่เพิ่มเติม O(1) (สำหรับเวอร์ชันแบบวนซ้ำ)
ต่างจากอาร์เรย์ QuickSort ไม่มีประสิทธิภาพสำหรับลิสต์แบบเชื่อมโยงเนื่องจากความซับซ้อนในการจัดเรียงตัวชี้ใหม่
34) ความแตกต่างระหว่างลิสต์เชื่อมโยงแบบเดี่ยว แบบคู่ และแบบวงกลมคืออะไร?
| ลักษณะ | เดี่ยวๆ | สองเท่า | กลม |
|---|---|---|---|
| การเชื่อมโยง | หนึ่ง (ถัดไป) | สอง (ก่อนหน้า & ถัดไป) | โหนดสุดท้ายเชื่อมต่อกับส่วนหัว |
| การข้ามผ่าน | ส่งต่อเท่านั้น | ไปข้างหน้าและถอยหลัง | สามารถท่องไปได้ไม่จำกัด |
| การแทรก/การลบ | ปานกลาง | ง่ายขึ้นทั้งสองด้าน | การจัดการกรณีพิเศษ |
| ใช้กรณี | สแต็ก, คิว | ยกเลิกการดำเนินการ | การจัดตารางแบบหมุนเวียน |
คำถามเปรียบเทียบนี้มักปรากฏขึ้นเพื่อตรวจสอบความเข้าใจในแนวคิด
35) จะหาจุดตัดของรายการเชื่อมโยงแบบวงกลมสองรายการได้อย่างไร?
นี่เป็นการต่อยอดจากปัญหาทางแยก
ขั้นตอนวิธีการ:
- ตรวจสอบว่าแต่ละรายการมีลูปหรือไม่
- ถ้าทั้งสองไม่มีวงจร → ให้ใช้อัลกอริทึมการหาจุดตัดมาตรฐาน
- ถ้าทั้งสองเป็นวัฏจักร → ให้หาจุดเริ่มต้นของวัฏจักรสำหรับแต่ละอัน แล้วตรวจสอบว่าจุดทั้งสองเหมือนกันหรือเชื่อมต่อกันหรือไม่
ปัญหานี้เป็นการรวมกันของ... การตรวจจับวงจร และ ตรรกะจุดตัดการทดสอบความสามารถในการให้เหตุผลแบบหลายแนวคิด
36) อธิบายวิธีการแทรกโหนดลงในรายการเชื่อมโยงที่เรียงลำดับแล้ว
ขั้นตอน:
- สร้างโหนดใหม่โดยใช้ค่าที่กำหนดให้
- เดินไปเรื่อยๆ จนกว่าจะพบตำแหน่งที่ถูกต้อง
- ปรับ
nextชี้ไปยังตัวชี้วัดตามนั้น
ตัวอย่าง:
Input: 1 → 3 → 5 → 7, Insert 4 Output: 1 → 3 → 4 → 5 → 7
นี่เป็นโจทย์ปัญหาพื้นฐานเกี่ยวกับการปรับตำแหน่งตัวชี้เมาส์
37) คุณจะแบ่งรายการเชื่อมโยงออกเป็นสองส่วนได้อย่างไร?
ขั้นตอนวิธีการ:
- ใช้ทั้งวิธีการชี้เมาส์แบบช้าและแบบเร็ว
- เมื่อ
fastถึงจุดสิ้นสุดแล้วslowจะอยู่ตรงจุดกึ่งกลาง - แยกที่จุดนั้น
ตัวอย่าง:
Input: 1 → 2 → 3 → 4 → 5 Output: 1 → 2 → 3 and 4 → 5
การดำเนินการนี้มักเป็นขั้นตอนแรกของการเรียงลำดับแบบผสานรายการเชื่อมโยง (linked list merge sort)
38) จะหาค่าที่ปรากฏครั้งสุดท้ายในรายการแบบลิงก์ได้อย่างไร?
ไล่ดูรายการไปเรื่อยๆ โดยติดตามโหนดสุดท้ายที่พบค่าเป้าหมายอยู่เสมอ
รหัสเทียม:
ListNode findLastOccurrence(ListNode head, int val) {
ListNode result = null;
while (head != null) {
if (head.val == val) result = head;
head = head.next;
}
return result;
}
ซับซ้อน: O (n)
แบบทดสอบนี้จะตรวจสอบความเข้าใจเกี่ยวกับการสำรวจเชิงเส้นและการตรวจสอบเงื่อนไข
39) คุณจะลบข้อมูลทั้งหมดที่ตรงกับคีย์ที่กำหนดออกจากรายการแบบเชื่อมโยงได้อย่างไร?
ขั้นตอนวิธีการ:
- หากโหนดหัวมีคีย์เป้าหมาย ให้ดำเนินการกับโหนดหัวก่อน
- จากนั้นให้วนลูปและลบโหนดถัดไปที่มีคีย์นั้นอยู่
ตัวอย่าง:
Input: 1 → 2 → 6 → 3 → 4 → 5 → 6, Key = 6 Output: 1 → 2 → 3 → 4 → 5
ซับซ้อน: O (n)
สิ่งนี้แสดงให้เห็นถึงความรู้เกี่ยวกับกรณีพิเศษ (โดยเฉพาะการลบส่วนหัว)
40) ความแตกต่างที่สำคัญระหว่างโครงสร้างข้อมูลแบบ Stack และ Linked List คืออะไร?
| ลักษณะ | กอง | รายการที่เชื่อมโยง |
|---|---|---|
| ประเภทการเข้าถึง | LIFO (เข้าก่อนออกก่อน) | เนื่อง |
| การดำเนินงาน | อาร์เรย์หรือรายการเชื่อมโยง | แบบอิงตามโหนด |
| Operations | ดัน/ป๊อป | แทรก/ลบ/สำรวจ |
| ความยืดหยุ่น | จำกัด การเข้าถึง | การเข้าถึงที่ยืดหยุ่น |
| ใช้กรณี | การจัดการการเรียกใช้ฟังก์ชัน | การจัดการข้อมูลแบบไดนามิก |
สามารถนำโครงสร้างแบบเรียงซ้อนมาใช้งานได้ โดยใช้รายการเชื่อมโยงแต่ทั้งสองแตกต่างกันในด้านแนวคิด — สแต็กมีการจำกัดการเข้าถึง ในขณะที่รายการเชื่อมโยงเป็นโครงสร้างอเนกประสงค์
🔍 รวมคำถามสัมภาษณ์ยอดนิยมพร้อมสถานการณ์จริงและคำตอบเชิงกลยุทธ์
1) ลิงค์ลิสต์คืออะไร และแตกต่างจากอาร์เรย์อย่างไร?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความเข้าใจของคุณเกี่ยวกับโครงสร้างข้อมูลพื้นฐานและความสามารถในการเปรียบเทียบข้อดีข้อเสีย
ตัวอย่างคำตอบ: รายการเชื่อมโยง (Linked List) เป็นโครงสร้างข้อมูลเชิงเส้นที่องค์ประกอบซึ่งเรียกว่าโหนดเชื่อมต่อกันโดยใช้ตัวชี้ แต่ละโหนดประกอบด้วยข้อมูลและการอ้างอิงไปยังโหนดถัดไป แตกต่างจากอาร์เรย์ รายการเชื่อมโยงไม่จำเป็นต้องใช้หน่วยความจำที่ต่อเนื่องกันและอนุญาตให้ปรับขนาดได้แบบไดนามิก แต่มีเวลาในการเข้าถึงที่ช้ากว่าเนื่องจากองค์ประกอบไม่ได้ถูกกำหนดดัชนี
2) ในการใช้งานจริง คุณจะเลือกใช้ลิสต์เชื่อมโยง (linked list) แทนอาร์เรย์ (array) เมื่อใด?
สิ่งที่คาดหวังจากผู้สมัคร: พวกเขากำลังประเมินวิจารณญาณเชิงปฏิบัติของคุณในการเลือกโครงสร้างข้อมูลที่เหมาะสม
ตัวอย่างคำตอบ: ฉันจะเลือกใช้ลิสต์เชื่อมโยงเมื่อจำเป็นต้องเพิ่มและลบข้อมูลบ่อยๆ โดยเฉพาะอย่างยิ่งในส่วนกลางของชุดข้อมูล ในงานก่อนหน้านี้ ฉันทำงานเกี่ยวกับฟีเจอร์การจัดตารางงาน ซึ่งมีการเพิ่มและลบงานบ่อยครั้ง และลิสต์เชื่อมโยงให้ประสิทธิภาพที่ดีกว่าอาร์เรย์
3) คุณช่วยอธิบายความแตกต่างระหว่างลิสต์แบบลิงก์เดี่ยวและลิสต์แบบลิงก์คู่ได้ไหม?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการตรวจสอบความเข้าใจในแนวคิดของคุณและความสามารถในการอธิบายความแตกต่างทางเทคนิคได้อย่างชัดเจน
ตัวอย่างคำตอบ: รายการเชื่อมโยงแบบเดี่ยว (Singly Linked List) มีโหนดที่ชี้ไปยังโหนดถัดไปเท่านั้น ในขณะที่รายการเชื่อมโยงแบบคู่ (Doubly Linked List) มีโหนดที่ชี้ไปยังทั้งโหนดถัดไปและโหนดก่อนหน้า รายการเชื่อมโยงแบบคู่ช่วยให้การท่องไปในทิศทางย้อนกลับทำได้ง่ายกว่า แต่ต้องการหน่วยความจำมากกว่าเนื่องจากมีตัวชี้เพิ่มเติม
4) คุณจะตรวจจับรอบในรายการที่เชื่อมโยงได้อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: แบบทดสอบนี้จะวัดทักษะการแก้ปัญหาและความคุ้นเคยกับรูปแบบอัลกอริทึมทั่วไปของคุณ
ตัวอย่างคำตอบ: วิธีการทั่วไปคือการใช้ตัวชี้สองตัวที่เคลื่อนที่ด้วยความเร็วต่างกัน ซึ่งมักเรียกว่าเทคนิคตัวชี้ช้าและตัวชี้เร็ว หากเกิดวงวน ตัวชี้ทั้งสองจะมาบรรจบกันในที่สุด ในตำแหน่งงานก่อนหน้านี้ ผมใช้วิธีนี้เพื่อป้องกันวงวนไม่สิ้นสุดในไปป์ไลน์การประมวลผลข้อมูล
5) การดำเนินการทั่วไปที่ใช้กับลิสต์แบบเชื่อมโยงมีอะไรบ้าง?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการดูว่าคุณเข้าใจขั้นตอนการปฏิบัติงานมาตรฐานและผลกระทบที่ตามมาหรือไม่
ตัวอย่างคำตอบ: การดำเนินการทั่วไป ได้แก่ การแทรก การลบ การวนซ้ำ การค้นหา และการกลับลำดับรายการ การดำเนินการแต่ละอย่างมีความซับซ้อนของเวลาที่แตกต่างกัน ขึ้นอยู่กับตำแหน่งที่ดำเนินการ ซึ่งเป็นสิ่งสำคัญในการออกแบบระบบที่มีประสิทธิภาพ
6) คุณจัดการกับการแทรกโหนดตรงกลางของรายการเชื่อมโยงอย่างไร?
สิ่งที่คาดหวังจากผู้สมัคร: พวกเขากำลังตรวจสอบความเข้าใจของคุณเกี่ยวกับการควบคุมตัวชี้เมาส์และความใส่ใจในรายละเอียด
ตัวอย่างคำตอบ: ในการแทรกโหนดตรงกลาง ขั้นแรกฉันจะวนไปตามรายการเพื่อหาตำแหน่งเป้าหมาย จากนั้นปรับตัวชี้เพื่อให้โหนดใหม่ชี้ไปยังโหนดถัดไป และโหนดก่อนหน้าชี้ไปยังโหนดใหม่ การอัปเดตตัวชี้อย่างระมัดระวังเป็นสิ่งสำคัญเพื่อหลีกเลี่ยงการทำให้รายการเสียหาย
7) อธิบายสถานการณ์ที่โครงสร้างข้อมูลแบบลิสต์เชื่อมโยงทำให้เกิดปัญหาด้านประสิทธิภาพ และคุณแก้ไขปัญหานั้นอย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: คำถามเชิงพฤติกรรมนี้ประเมินความสามารถของคุณในการไตร่ตรองและปรับปรุงให้เหมาะสมที่สุด
ตัวอย่างคำตอบ: ในงานก่อนหน้านี้ ผมใช้โครงสร้างข้อมูลแบบลิสต์เชื่อมโยง (linked list) สำหรับการค้นหาข้อมูลบ่อยครั้ง ซึ่งส่งผลให้ประสิทธิภาพการทำงานช้าลง ผมจึงระบุปัญหาและแนะนำให้เปลี่ยนไปใช้โครงสร้างข้อมูลแบบแฮช (hash-based structure) ซึ่งช่วยปรับปรุงเวลาในการค้นหาได้อย่างมาก
8) คุณจะกลับลำดับของรายการเชื่อมโยงได้อย่างไร?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการทดสอบความคิดเชิงตรรกะและความเข้าใจของคุณเกี่ยวกับวิธีการแบบวนซ้ำหรือแบบเรียกซ้ำ
ตัวอย่างคำตอบ: ฉันจะกลับลำดับของรายการเชื่อมโยงโดยการวนซ้ำผ่านรายการนั้นและเปลี่ยนตัวชี้ next ของแต่ละโหนดให้ชี้ไปยังโหนดก่อนหน้า กระบวนการนี้จะดำเนินต่อไปจนกว่าตัวชี้ทั้งหมดจะถูกกลับลำดับและส่วนหัวของรายการได้รับการอัปเดต
9) การใช้ลิสต์เชื่อมโยงมีข้อดีและข้อเสียอย่างไรบ้าง?
สิ่งที่คาดหวังจากผู้สมัคร: พวกเขาต้องการมุมมองที่สมดุลและตระหนักถึงข้อแลกเปลี่ยนต่างๆ
ตัวอย่างคำตอบ: ข้อดีได้แก่ ขนาดที่ปรับเปลี่ยนได้ และการแทรกและลบข้อมูลที่มีประสิทธิภาพ ส่วนข้อเสียได้แก่ การใช้หน่วยความจำที่สูงกว่า และเวลาในการเข้าถึงที่ช้ากว่าเมื่อเทียบกับอาร์เรย์ ในบทบาทงานก่อนหน้านี้ของผม การเข้าใจข้อดีข้อเสียเหล่านี้ช่วยในการเลือกโครงสร้างที่เหมาะสมสำหรับส่วนประกอบต่างๆ
10) คุณตัดสินใจเลือกใช้โครงสร้างข้อมูลแบบ Linked List ประเภทใดในการออกแบบระบบได้อย่างไร?
สิ่งที่คาดหวังจากผู้สมัคร: คำถามเชิงสถานการณ์นี้ประเมินการตัดสินใจในบริบททางสถาปัตยกรรม
ตัวอย่างคำตอบ: ฉันพิจารณาปัจจัยต่างๆ เช่น ความต้องการในการท่องไปในโครงสร้างข้อมูล ข้อจำกัดด้านหน่วยความจำ และความถี่ในการดำเนินการ ตัวอย่างเช่น หากจำเป็นต้องท่องไปในโครงสร้างข้อมูลแบบย้อนกลับ โครงสร้างข้อมูลแบบรายการเชื่อมโยงสองทางจะเหมาะสมกว่า ในขณะที่โครงสร้างข้อมูลแบบรายการเชื่อมโยงทางเดียวก็เพียงพอสำหรับการใช้งานที่เรียบง่ายและประหยัดหน่วยความจำ

