Senarai terpaut berganda Juga dipanggil senarai terpaut berganda, ia adalah jenis senarai terpaut Setiap nod datanya mempunyai dua penunjuk, masing-masing menunjuk kepada pengganti langsung dan pendahulu langsung. Oleh itu, bermula dari mana-mana nod dalam senarai terpaut berganda, anda boleh mengakses dengan mudah nod pendahulunya dan nod pengganti
Rajah di bawah adalah dua hala Struktur logik gambar rajah senarai terpaut adalah berbeza daripada senarai terpaut tunggal kerana setiap nod dalam senarai terpaut dua kali mengandungi rujukan penunjuk kepada dua nod dan medan data kedua-dua nod ini masing-masing menghala ke nod sebelumnya dan nod seterusnya 🎜>Berbanding dengan senarai pautan tunggal, struktur senarai pautan berganda ini mempunyai peningkatan dalam hal ini Dengan merujuk pada nod hadapan dan belakang, keseluruhan senarai terpaut boleh dilalui ke hadapan atau ke belakang dengan nilai yang diberikan, yang sangat dipertingkatkan. Kecekapan pertanyaan traversal menyelesaikan masalah prestasi senarai terpaut tunggal pada tahap tertentu, tetapi pada masa yang sama, overhed storan senarai terpaut juga meningkat Lapisan bawah linkedList yang biasa dilaksanakan oleh prinsip ini 🎜>
Tiada lagi perkara karut, saya percaya semua orang telah memahaminya melalui penjelasan di atas >Jalankan fungsi utama, anda boleh melihat cetakan konsol:
public class DoubleLinkTest<T> { /** * 内部构造节点类 * * @param <T> */ private class Node<T> { private T data; private Node next; // 指向下一个节点的引用 private Node prev; // 指向前一个节点的引用 public Node(T data) { this.data = data; } } private Node<T> head; // 模拟头结点 private Node<T> last; // 模拟尾部节点 private Node<T> other; // 暂定一个临时节点,用作指针节点 private int length; public void DoubleLinkTest() { head = new Node<T>(null); last = head; length = 0; } public void DoubleLinkTest(T data) { head = new Node<T>(data); last = head; length = 0; } /** * 链表是否为空 * * @return */ public boolean isEmpty() { return length == 0; } /** * 普通添加,往链表尾部添加 * * @param data */ public void add(T data) { if (isEmpty()) { // 链表为空,新创建一个链表 head = new Node<T>(data); last = head; length++; } else { other = new Node<T>(data); other.prev = last; last.next = other; // 将新的节点与原来的尾部节点进行结构上的关联 last = other; // other将成为最后一个节点 length++; } } /** * 在指定的数据后面添加数据 * * @param data * @param insertData */ public void addAfter(T data, T insertData) { other = head; while (other != null) { // 我们假定这个head是不为空的。 if (other.data.equals(data)) { Node<T> t = new Node<T>(insertData); t.prev = other; t.next = other.next;// 对新插入的数据进行一个指向的定义 other.next = t; if (t.next == null) { last = t; } length++; } other = other.next; } } /** * 删除,删除指定的数据 * * @param data */ public void remove(T data) { other = head;// 我们假定这个head是不为空的。 while (other != null) { if (other.data.equals(data)) { other.prev.next = other.next; length--; } other = other.next; } } /** * 测试打印数据 */ public void printList() { other = head; for (int i = 0; i < length; i++) { System.out.println(other.data + " "); other = other.next; } } public static void main(String[] args) { DoubleLinkTest<Integer> link = new DoubleLinkTest<Integer>(); link.add(1); link.add(2); link.add(3); link.add(5); link.add(6); link.add(7); link.printList(); System.out.println(" ============== "); System.out.println(" ==== 在3后面添加一个数据开始========== "); link.addAfter(3, 99); link.printList(); System.out.println(" ==== 在3后面添加一个数据结束========== " + "\r\n"); System.out.println(" ==== 移除一个数据开始========== "); link.remove(99); link.printList(); System.out.println(" \r\n"); } }
Atas ialah kandungan terperinci Kaedah simulasi Java untuk melaksanakan senarai pautan berganda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!