双向链表相较于单向链表的好处就是能够双向遍历,存在next域指向下一个节点和pre域指向前一个节点
节点定义:
public class Node {
public int no;
public Node next; //指向下一个节点
public Node pre; //指向前一个节点
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Node(int no, String name) {
this.no = no;
this.name = name;
}
public Node(int no) {
this.no = no;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
增加节点
增加节点就是找到链表的末端进行添加,将当前节点的next指向需要加入的节点,然后需要加入的节点的pre域指向当前节点。
代码:
//添加节点
public void addNode(Node node){
Node temp = head;
while(temp.next != null){
temp = temp.next;
}
//添加的关键就是:当前节点的next域指向需要加入的节点,加入的节点的pre域指向当前节点
temp.next = node;
node.pre = temp;
}
删除节点
删除节点就是找到需要删除的节点,将这个节点的前一个节点的next域指向待删节点的下一个节点,同时将待删节点的下一个节点的pre域指向待删节点的前一个节点,这样就实现了节点的自我删除。
这里要注意,如果待删节点在最后一个的话,就不用改变待删节点的下一个节点,不注意的话就会出现空指针异常
代码:
//删除节点
public void deleteNode(int no){
if(head.next == null){
System.out.println("链表为空,无法删除");
return;
}
Node temp = head.next;
Boolean flag = false; //标志是否找到节点
while(temp != null){
if(temp.no == no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.pre.next = temp.next;
if(temp.next != null) { //如果为最后一个节点会报空指针异常
temp.next.pre = temp.pre;
}
System.out.println("删除成功");
}else{
System.out.println("未找到节点,删除失败");
}
}
修改节点
修改节点和单链表的操作一样,通过辅助指针找到节点,然后直接修改相应的元素
//修改节点
public void updateNode(Node node){
if(head.next == null){
System.out.println("链表为空,无法进行修改");
return;
}
Node temp = head.next; //辅助节点
Boolean flag = false; //用来标记是否找到该节点
while(temp != null){
if(temp.no == node.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.setName(node.getName());
System.out.println("修改成功");
}else{
System.out.println("未找到该节点,修改失败");
}
}
查找节点
查找节点也是通过辅助指针找到相应节点,找到就返回,没找到就返回null
//查找节点
public Node findNode(int no){
if(head.next == null){
System.out.println("链表为空,查找失败");
return null;
}
Node temp = head; //辅助节点
Boolean flag = false; //标志是否找到
while(temp != null){
if(temp.no == no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
System.out.println("查找成功");
return temp;
}else{
System.out.println("未找到,节点不存在或者输入错误");
return null;
}
}