文章目录
双链表(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;}@Overridepublic 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 方法通过遍历链表查找指定编号的节点,并返回该节点的引用。
双链表是一种使用两个指针的数据结构,它可以支持在节点前后插入或删除节点,并且可以在前向和后向两个方向上遍历和操作节点。