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