การลบโหนดออกจากลิงค์ลิสต์ ต้องใช้พอยเตอร์ 2ตัวท่องตามติดเขาไปในลิงค์ลิสต์ เช่น
จากตัวอย่างใช้ชื่อพอยเตอร์ว่า start กับ prev เมื่อตัวหน้าคือ start ค้นพบโหนด ก็ให้ใช้พอยเตอร์ตัวก่อนหน้า คือ prev จัดการเชื่อมโยงพอยเตอร์เสียให้ถูกต้องดังตัวอย่างภาพต่อไปนี้
หากต้องการลบโหนดที่เก็บชื่อว่า Yupin
Yupin Aree Suda
root
prev start
จากนี้ไป โหนดที่เก็บชื่อ Yupin ไม่ได้อยุ่ที่ในลิสต์อีกต่อไป เพราะถูกตัดออกจากลิสต์เรียบร้อยแล้ว หากมีการท่องเข้าไปในลิสต์เพื่อพิมพ์ค่าทุกตัวในลิสต์นี้
การใช้คำสั่ง delete
เพื่อให้กระบวนการในการลบโหนดครบสมบูรณ์ต้องไม่ลืมคืนโหนดที่ไม่ใช้แล้วกลับคืนไปยังหน่วยที่ทำหน้าที่จัดสรรเซลล์ ทั้งนี้เพื่อที่จะได้นำเซลล์ ที่ไม่ใช้นี้เพื่อการอื่นต่อไป คืนโหนดด้วยคำสั่ง
Delete start ;
การ Delete แต่ละครั้งสามารถคืนเซลล์ได้เพียงเซลล์เดียว คือ เซลล์ที่มีพอยเตอร์ชี้อยู่เท่านั้น ดังนั้น หากต้องการ Delete ทุกๆโหนดในลิสต์จำเป็นต้องใช้วิธีการวนลูป
จากตัวอย่างการลบโหนดที่เก็บชื่อ yupin ออกจากลิสต์ที่ผ่านมา มีคำถามตามมาคือ วิธีการข้างต้นสามารถนำมาใช้กับการลบโหนดใดๆ ในลิสต์หรือไม่ คำตอบก็คือใช้ไม่ได้กับกรณีที่ต้องลบโหนดแรกสุกในลิสต์ เพราะกรณีที่เป็นโหนดแรก แต่ prve ยังไม่มีค่า นอกจานี้การลบโหนดแรกจะมีผลให้พอยเตอร์ที่ชี้อยู่หน้าสุดของลิสต์เปลี่ยนไปด้วย ดังนั้น ที่ถูกต้องคือให้เปลี่ยนไปชี้ยังโหนดถัดไป คือโหนดที่2 หรือโหนดที่เก็บชื่อ Aree ดังนั้น คำสั่งเพื่อการลบโหนดแรกควรเปลี่ยนเป็น
If (start = = root) /*หากโหนดที่ต้องการลบอยู่หน้าสุด*/ { root = root -> next ; /* จัดการย้าย root ให้ชี้ไปยังโหนดถัดไป*/ delete start ; /*คืนโหนดที่ไม่ใช้แล้ว*/ }
3.10.1 การลบโหนดจากลิสต์ที่ไม่มีการเรียงลำดับ
แนวทางวิเคราะห์ปัญหา
หากลิงค์ลิสต์มีลักษณะของโหนด ซึ่งเก็บรหัสดังนี้
1102 1105n 1103 1108
root
ใช้พอยเตอร์ 2 ตัวคือ start prev ตามติดกันไปเพื่อท่องในลิสต์เพื่อค้นหาโหนดที่จะทำการลบ หากค้นเจอ start จะชี้อยู่ที่โหนดที่เจอ ส่วน prev จะชี้อยูที่โหนดก่อนหน้า จากนั้นให้จัดการลบโหนดที่ชี้โดย start ออกไปจากลิสต์
3.10.2 การลบโหนดจาลิสต์ที่มีการเรียงลำดับ
ฟังก์ชั่น delNode สามารถใช้ลบโหนดทั่วไปทั้งกับโหนดในลิสต์ที่เรียงลำดับหรือไม่เรียงลำดับก็ได้ แต่หากนำไปใช้เพื่อการลบโหนดในลิสต์ที่เรียงลำดับแล้ว จะมีข้อเสียในประเด็นที่หากค้นหาโหนดที่ต้องการลบไม่พบ กว่าจะทราบว่าไม่พบก็ต่อเมื่อได้ค้นหาจนถึงโหมดสุดท้ายในลิสต์แล้ว ซึ่งทำให้เสียเวลาโดยใช่เหตุ ในความเป็นจริง เนื่องจากทราบว่าโหนดได้มีการเรียงลำดับแล้ว ดังนั้น ควรจะสั่งยุติการท่องในลิสต์นั้นทันทีที่ได้ค้นพบว่าได้ท่องมาถึงโหนดที่บ่งบอกว่าเลยแล้ว หากท่องต่อไปก็จะยิ่งพบโหนดที่ทีค่ามากขึ้นตามลำดับ จึงไม่มีความจำเป็นต้องท่องจนถึงโหนดสุดท้าย ดังภาพ
1108 1109 1108 1105n 1104 1102
root
start
หากต้องการลบโหนดที่มีรหัส 1103 จะเห็นว่าเมื่อท่อง start มาถึงโหนด 1104 ก็สามารถสรุปได้ทันทีว่าไม่พบโหนดที่เก็บค่า 1103
สวัสดีคะ น้องระพีพร
พี่เป็นผู้ดูแลเว็บไซต์คะ และได้ลองอ่านบันทึกทั้งหมดในบล็อกของน้องแล้ว คิดว่าวัตถุประสงค์ของการใช้งานบล็อกของน้อง คงจะเพื่อการส่งการบ้าน หรือส่งงานให้อาจารย์
พี่รบกวนน้องย้ายบล็อกเพื่อส่งการบ้านไปยัง http://learners.in.th คะ ซึ่งใช้งานเช่นเดียวกัน GotoKnow.org
โดย Learners.in.th นั้น เป็นบล็อกเพื่อการเรียนการสอน ดังนั้นน้องๆ นักศึกษาสามารถเขียนบล็อกเพื่อส่งงานที่นี่ได้คะ
สำหรับ GotoKnow.org เป็นบล็อกที่มีวัตถุประสงค์สำหรับการแลกเปลี่ยนประสบการณ์คะ