มีตัวเลือกอื่น: โหนดเป็นวัตถุขอบเป็นวัตถุด้วยเช่นกันแต่ละขอบจะอยู่ในเวลาเดียวกันในรายการที่เชื่อมโยงสองเท่า: รายการของขอบทั้งหมดที่ออกมาจากโหนดเดียวกันและรายการของขอบทั้งหมดที่เข้าสู่โหนดเดียวกัน .
struct Node {
... node payload ...
Edge *first_in; // All incoming edges
Edge *first_out; // All outgoing edges
};
struct Edge {
... edge payload ...
Node *from, *to;
Edge *prev_in_from, *next_in_from; // dlist of same "from"
Edge *prev_in_to, *next_in_to; // dlist of same "to"
};
ค่าใช้จ่ายของหน่วยความจำมีขนาดใหญ่ (2 พอยน์เตอร์ต่อโหนดและ 6 พอยน์เตอร์ต่อขอบ) แต่คุณจะได้รับ
- การแทรกโหนด O (1)
- การแทรกขอบ O (1) (ให้ตัวชี้ไปที่โหนด "จาก" และ "ถึง")
- O (1) การลบขอบ (กำหนดตัวชี้)
- การลบโหนด O (deg (n)) (กำหนดตัวชี้)
- O (deg (n)) ค้นหาเพื่อนบ้านของโหนด
โครงสร้างนี้ยังสามารถแสดงถึงกราฟที่ค่อนข้างทั่วไปนั่นคือกราฟหลายเชิงที่มีการวนซ้ำ (กล่าวคือคุณสามารถมีขอบที่แตกต่างกันหลาย ๆ อันระหว่างสองโหนดเดียวกันรวมถึงการวนซ้ำที่แตกต่างกันหลาย ๆ อัน - ขอบจาก x ถึง x)
คำอธิบายรายละเอียดของวิธีการนี้สามารถใช้ได้ที่นี่