1.链表介绍
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
2.示意图
3. 双向链表的增删改查
package linked02;
/**
* @author WuChenGuang
*/
public class BookNode {
public int id;
public String name;
public double price;
// 节点下一个节点 直接后继
public BookNode next;
// 节点上一个节点 直接前驱
public BookNode pre;
public BookNode(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
}
package linked02;
/**
* @author WuChenGuang
*/
public class DualLinkedList {
private BookNode head = new BookNode(0,"",0.0);
/**
* 添加结尾新的节点
*/
public void addLast(BookNode newNode){
BookNode temp = head;
// 如果第一次进来则进入,表示双向链表是空数据
while (temp.next != null) {
temp = temp.next;
}
// 需要把新的节点给上一个节点
// 需要把上一个节点next指向新的节点
temp.next = newNode;
newNode.pre = temp;
}
/**
* 修改节点
* 条件:双向链表中的每一个结点的id和修改的id对比,如果对比成功,则进行修改该结点
* ,如果没有对比成功,双向链表中未找到目标结点
*/
public void updateNode(BookNode node){
// 判断是否空链表
if (head.next == null){
System.out.println("空链表...");
return;
}
BookNode temp = head.next;
boolean flg = false;
while (true){
if (temp == null){
break;
}
if (temp.id == node.id){
flg = true;
break;
}
temp = temp.next;
}
if (flg){
temp.name = node.name;
temp.price = node.price;
}else {
System.out.println("未找到要修改的节点...");
}
}
/**
* 双向链表删除
* 条件:根据id编号进行删除节点
*/
public void delNode(int id){
if (head.next == null){
System.out.println("空链表...");
return;
}
BookNode temp = head.next;
boolean flg = false;
while (true){
if (temp == null){
break;
}
if (temp.id == id){
flg = true;
break;
}
temp = temp.next;
}
if (flg){
temp.pre.next = temp.next;
if (temp.next !=null){
temp.next.pre = temp.pre;
}
}else {
System.out.println("未找到该结点...");
}
}
}
package linked02;
/**
* @author WuChenGuang
*/
public class DualLinkedListTest {
public static void main(String[] args) {
DualLinkedList dualLinkedList = new DualLinkedList();
BookNode bookNode1 = new BookNode(1, "红楼梦", 66.0);
BookNode bookNode2 = new BookNode(2, "西游记", 76.0);
BookNode bookNode3 = new BookNode(3, "水浒传", 86.0);
BookNode bookNode4 = new BookNode(4, "三国演义", 96.0);
// 按顺序添加结尾元素
dualLinkedList.addLast(bookNode1);
dualLinkedList.addLast(bookNode2);
dualLinkedList.addLast(bookNode3);
dualLinkedList.addLast(bookNode4);
// 修改元素
dualLinkedList.updateNode(new BookNode(3, "计算机", 66.0));
// 删除元素
dualLinkedList.delNode(1);
}
}
总结:双向链表与单链表虽然有所区别,但方法的实现大同小异,我们也应该熟练掌握,多画图更易帮助我们理解,都是基础的知识。