双向链表
继单链表之后,再来一波双向链表,双向链表和单向链表的区别在于在不考虑环形结构的情况下双向链表中的节点都是拥有前后两个指针指向的(除了第一个和最后一个节点)比起单向链表的操作来说更加方便,话不多说,直接上代码
节点声明
避免占用过多的篇幅,所以其余的get set tostring 方法就不贴过来了
public class Node {
public int no;
public String name;
public String nickName;
public Node pre; //指向前一个节点
public Node next; //指向后一个节点
}
构造双向链表
public class DoubleLinkedList {
//声明一个头节点,有便于操作
public Node head = new Node(0,"","");
}
以下所有的方法都是声明在上面的DoubleLinkedList类中的
添加节点
默认的添加方法即将节点加入到链表的最后,核心就在于如何操作指针的指向,temp.next = node; node.pre = temp;大家思考一下便可知是如何操作的
public void add(Node node){
//临时节点用来遍历
Node temp = head;
//遍历链表到最后
while (true){
//找到链表最后一位
if (temp.next == null){
break;
}
temp = temp.next;
}
//此时temp指向最后链表最后一个节点
temp.next = node;
node.pre = temp;
}
修改节点
根据节点的编号对节点的信息进行修改,核心思想:通过临时节点遍历找到待修改的节点
public void update(Node node){
//判断链表是否为空
if (head.next == null){
System.out.println("链表为空");
return;
}
//临时节点进行遍历找到要修改的节点
Node temp = head.next;
boolean flag = false;
while (temp != null && temp.no != node.no){
temp = temp.next;
}
//遍历完毕,此时temp所在位置即为所要修改的节点,但temp有可能指向最后一个节点的下一个位置,即没找到要修改的节点
if (temp == null){
//没有找到
System.out.println("没有找到编号为" + node.no + "的节点");
}else {
//正常找到并修改
temp.setName(node.name);
temp.setNickName(node.nickName);
}
}
删除节点
在单向链表中我们可能需要去找到要删除节点的前一个节点进行指针指向的操作,而在双向链表中直接找到待删除的节点进行操作即可
public void delete(int no){
//思路:找到待删节点进行删除
Node temp = head;
while (temp != null && temp.no != no){
temp = temp.next;
}
if (temp != null){
//找到待删节点
temp.pre.next = temp.next;
if (temp.next != null) {
//如果temp是最后一个节点 可能会出现空指针异常
temp.next.pre = temp.pre;
}
}else {
//未找到待删节点
System.out.println("要删除的编号为" + no + "的节点未找到");
}
}
最后则是遍历,正常的简单遍历和单链表其实也是没有什么区别的
public void list(){
//通过辅助节点,遍历
//判断链表是否为空
if (head.next == null){
System.out.println("链表为空");
return;
}
Node temp = head.next;
while (temp != null){
//输出节点信息
System.out.println(temp);
temp = temp.next;
}
}
双向列表也就到此结束,希望看到的每一位xd都能留个赞,如有错误,烦请各位留言指正,不胜感激!!