1、啥是双链表?
双链表也是链表的一种,相对于单链表而言,双链表是双向的。既有包含指向序列的前一个节点的指针,又包含指向序列的下一个节点的指针。所以基本的操作都是大同小异的,还没有了解过单链表的小伙伴可以先去了解一下。
2、思路
对上图的说明: 分析 双向链表的遍历,添加,修改,删除的操作思路
1) 遍历
2) 添加
3) 修改
4) 删除
在初始化链表时,只需要在在单链表的基础上,加上
heroNode.previous = temp;让每次添加都指向前一个节点,这样链表就变成了双向了。
public void addNode(HeroNode heroNode) {
HeroNode temp = headNode;
while (true) {
if (temp.next == null) {
break;
} else {
temp = temp.next;
}
}
temp.next = heroNode;
heroNode.previous = temp;
}
遍历节点思路和单链表是一样的。可以向前,也可以向后查找
public void listNode(HeroNode headNode) {
HeroNode temp = headNode.next;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
添加节点:
若添加在俩个节点之间,则顺序就是①——>②——>③——>④
① heroNode.next=temp.next; ② temp.next=heroNode; ③ temp.next.previous=temp; ④ temp.next.next.previous=temp.next;
若在最后添加,如果在用上述方法就会造成空指针。在最后添加只需要2、3俩步骤。
② temp.next=heroNode; ③ heroNode.previous=temp;
public void addNodePlus(HeroNode heroNode){ // inseret node in the specified location
HeroNode temp=headNode;
while (true){
if(temp.num==heroNode.num){
System.out.println("你想添加的节点已经存在,请勿重复添加"); // duplicate judge
break;
}
if(temp.next==null&&temp.num<heroNode.num){ //add in the end
temp.next=heroNode;
heroNode.previous=temp;
break;
}
if(temp.next!=null&&temp.num<heroNode.num&&temp.next.num>heroNode.num){ // add in middle
heroNode.next=temp.next;
temp.next=heroNode;
temp.next.previous=temp;
temp.next.next.previous=temp.next;
break;
}
temp=temp.next;
}
}
修改节点
通过num编号找到要修改的节点。找到后用新的链表携带信息覆盖。
public void update(HeroNode heroNode){
HeroNode temp=headNode;
while(true){
if(temp.num==heroNode.num){
temp.nickname="babyYuan";
break;
}
if(temp.next==null){
System.out.println("你需要修改的节点都不存在");
break;
}
temp=temp.next;
}
}
删除节点
删除节点时,若节点在中间
temp.previous.next=temp.next;
temp.next.previous=temp.previous;
把该节点的前一个节点指向该节点的下一个节点。
该节点的下一个节点指向该节点的前一个节点。
就把关于该节点的链子全部断开了。
若节点在最后
temp.previous.next=null;
temp.previous=null;
直接把temp的前一个节点指向的下一个节点为空
把temp的前节点也指向为空。
public void deleteNode(HeroNode heroNode){
HeroNode temp=headNode;
while(true){
if(temp.next==null&&temp.num==heroNode.num){ //in the last node if not judge will produce nullPointExcption
temp.previous.next=null;
temp.previous=null;
break;
}
if(temp.num==heroNode.num){
temp.previous.next=temp.next;
temp.next.previous=temp.previous;
break;
}
temp=temp.next;
if(temp.next==null){
System.out.println("你要删除的节点编号"+heroNode.num+"不存在");
break;
}
}
}
附上全部代码:
package DoubleLinkedList;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
HeroNode heroNode1 = new HeroNode(1, "老詹", "zwq");
HeroNode heroNode2 = new HeroNode(2, "老王", "王兰花");
HeroNode heroNode4 = new HeroNode(4, "英姐", "嘤嘤嘤");
HeroNode heroNode5 = new HeroNode(5, "小黄", "小黄🐟");
HeroNode heroNode3 = new HeroNode(3, "徐天地", "徐帅");
HeroNode heroNode6 = new HeroNode(6, "小袁", "baby");
DoubleLinkedList dl = new DoubleLinkedList();
dl.addNode(heroNode1);
dl.addNode(heroNode2);
dl.addNode(heroNode4);
dl.addNode(heroNode5);
dl.listNode(dl.getHeadNode());
System.out.println("----------------------");
dl.addNodePlus(heroNode3);
// dl.deleteNode(heroNode3);
dl.addNodePlus(heroNode6);
dl.listNode(dl.getHeadNode());
System.out.println("----------------------");
dl.update(heroNode6);
dl.listNode(dl.getHeadNode());
System.out.println("----------------------");
}
}
class DoubleLinkedList {
private HeroNode headNode = new HeroNode(0, "0", "0");
public HeroNode getHeadNode() {
return headNode;
}
public void addNode(HeroNode heroNode) {
HeroNode temp = headNode;
while (true) {
if (temp.next == null) {
break;
} else {
temp = temp.next;
}
}
temp.next = heroNode;
heroNode.previous = temp;
}
public void addNodePlus(HeroNode heroNode){ // inseret node in the specified location
HeroNode temp=headNode;
while (true){
if(temp.num==heroNode.num){
System.out.println("你想添加的节点已经存在,请勿重复添加"); // duplicate judge
break;
}
if(temp.next==null&&temp.num<heroNode.num){ //add in the end
temp.next=heroNode;
heroNode.previous=temp;
break;
}
if(temp.next!=null&&temp.num<heroNode.num&&temp.next.num>heroNode.num){ // add in middle
heroNode.next=temp.next;
temp.next=heroNode;
temp.next.previous=temp;
temp.next.next.previous=temp.next;
break;
}
temp=temp.next;
}
}
public void deleteNode(HeroNode heroNode){
HeroNode temp=headNode;
while(true){
if(temp.next==null&&temp.num==heroNode.num){ //in the last node if not judge will produce nullPointExcption
temp.previous.next=null;
temp.previous=null;
break;
}
if(temp.num==heroNode.num){
temp.previous.next=temp.next;
temp.next.previous=temp.previous;
break;
}
temp=temp.next;
if(temp.next==null){
System.out.println("你要删除的节点编号"+heroNode.num+"不存在");
break;
}
}
}
public void update(HeroNode heroNode){
HeroNode temp=headNode;
while(true){
if(temp.num==heroNode.num){
temp.nickname="babyYuan";
break;
}
if(temp.next==null){
System.out.println("你需要修改的节点都不存在");
break;
}
temp=temp.next;
}
}
public void listNode(HeroNode headNode) {
HeroNode temp = headNode.next;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
}
class HeroNode {
int num;
String name;
String nickname;
HeroNode next;
HeroNode previous;
public HeroNode(int num, String name, String nickname) {
this.num = num;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode{" +
"num=" + num +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}