Doubly linked list Also called a doubly linked list, it is a type of linked list. Each of its data nodes has two pointers, pointing to the direct successor and direct predecessor respectively. Therefore, starting from any node in the doubly linked list, you can easily access its predecessor node and successor node
The following figure is two-way The logical structure diagram of a linked list is different from a singly linked list in that each node in a doubly linked list contains pointer references to two nodes and a data field. These two nodes point to the previous node and the next node respectively;
This structure of a doubly linked list is improved compared to a singly linked list. By referencing the front and rear nodes, the entire linked list can be traversed forward or backward with a given value, which is greatly improved. The efficiency of traversal query solves the performance problem of singly linked list to a certain extent, but at the same time, the storage overhead of linked list also increases. The bottom layer of the familiar linkedList is implemented by this principle.
Without further ado, I believe everyone has understood it clearly through the above explanation. Let’s go directly to the code. You can understand the doubly linked list by combining the code and graph structure.
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"); } }
Run the main function, You can see the console printout:
The above is the detailed content of Java simulation method to implement doubly linked list. For more information, please follow other related articles on the PHP Chinese website!