การลบโหนดออกจากลิงค์ลิสต์  ต้องใช้พอยเตอร์ 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