双链表(Doubly Linked List)是一种常用的数据结构,它与单链表相似,但每个节点除了包含指向下一个节点的指针外,还包含一个指向前一个节点的指针。
双链表的节点由三部分组成:数据域(存储节点的数据)、指向前一个节点的指针和指向后一个节点的指针。 通过这两个指针,双链表可以在前向和后向两个方向上遍历和操作节点。
双链表相对于单链表的主要优点是,它可以方便地在给定节点的前后插入或删除节点,而无需遍历查找。这使得双链表在某些场景下更加高效。
另外,双链表支持双向遍历。即可以从头节点开始,按照后继指针一直遍历到尾节点,也可以从尾节点开始,按照前驱指针一直遍历到头节点。
虽然双链表在插入和删除操作上比单链表更加灵活,但相应地也需要更多的存储空间来存储额外的指针。因此,在空间有限的情况下,需要权衡使用单链表或双链表来满足特定需求。
代码实现:
public class HeroNode2 { public int no; public String nickname; public HeroNode2 pre; public HeroNode2 next; public HeroNode2(int no, String nickname) { this.no = no; this.nickname = nickname; } @Override public String toString() { return "HeroNode2{" + "no=" + no + ", nickname='" + nickname + '\'' + '}'; } }
public class DoubleLinkedList { // 先初始化一个头节点, 头节点不要动, 不存放具体的数据 private HeroNode2 head = new HeroNode2(0,""); /** 添加 */ public void add(HeroNode2 newNode){ if( newNode == null ){ return; } HeroNode2 currentNode = head; while (currentNode.next != null){ currentNode = currentNode.next; } currentNode.next = newNode; newNode.pre = currentNode; } /** 删除 */ public void del(int no){ if( no < 1 ){ return; } HeroNode2 currentNode = head.next; while ( currentNode != null ){ if( currentNode.no == no ){ if( currentNode.next == null ){ currentNode.pre.next = null; }else{ currentNode.pre.next = currentNode.next; currentNode.next.pre = currentNode.pre; } return; } currentNode = currentNode.next; } } /** 遍历 */ public void show(){ HeroNode2 currentNode = head.next; while (currentNode != null){ System.out.println(currentNode); currentNode = currentNode.next; } } /** 查询 */ public HeroNode2 getByNo(int no){ if( no < 1 ){ return null; } HeroNode2 currentNode = head.next; while ( currentNode != null ){ if( currentNode.no == no ){ return currentNode; } currentNode = currentNode.next; } return null; } }
这段代码实现了一个双链表(DoubleLinkedList)的基本操作,包括添加节点、删除节点、遍历和根据节点编号查询节点等操作。
首先,在双链表类中初始化了一个头节点 head,该头节点不存放具体的数据,仅作为链表的起始标志。
添加节点的 add 方法通过遍历链表找到尾节点,然后将新节点加在尾节点之后,同时设置新节点的前驱指针为当前尾节点。
删除节点的 del 方法首先根据传入的节点编号查找到要删除的节点,然后根据节点的前驱和后继节点情况进行连接操作,从而将该节点从链表中删除。
遍历链表的 show 方法通过遍历输出链表中所有节点的内容,便于查看链表中的数据。
根据节点编号查询节点的 getByNo 方法通过遍历链表查找指定编号的节点,并返回该节点的引用。
双链表是一种使用两个指针的数据结构,它可以支持在节点前后插入或删除节点,并且可以在前向和后向两个方向上遍历和操作节点。