1.4 双向链表
1.4.1 双向链表介绍
- 双向链表相比于单链表多了一个prev指针指向该节点的前一个节点
- 示意图:
1.4.2 双向链表实现思路
-
添加
-
添加到最后
-
按照顺序添加
-
-
删除
1.4.3 双向链表实现代码及其输出结果
import java.util.Objects;
import java.util.Stack;
class doubleLinkList{
private HeroNode02 head = new HeroNode02(0,"","");
public HeroNode02 getHead(){
return head;
}
public void addNodeByOrder(HeroNode02 heroNode){ // 按no顺序插入
HeroNode02 temp = head;
while(temp.getNext() != null){
if(Objects.equals(temp.getNext().getNo(), heroNode.getNo())){
System.out.println("链表内已有该no的节点!");
return;
}
if(heroNode.getNo() > temp.getNext().getNo()){
temp = temp.getNext();
} else if (heroNode.getNo() < temp.getNext().getNo()) {
System.out.println("根据no顺序添加节点: "+heroNode.getNo());
heroNode.setNext(temp.getNext());
heroNode.setPrev(temp);
temp.getNext().setPrev(heroNode);
temp.setNext(heroNode);
return;
}
}
// 链表为空情况下
System.out.println("添加节点到空链表: "+heroNode.getNo());
temp.setNext(heroNode);
heroNode.setPrev(temp);
}
public boolean isEmpty(){ // 判断链表是否为空
return head.getNext() == null;
}
public void addNode(HeroNode02 heroNode){ // 添加链表节点
HeroNode02 temp = head;
while (temp.getNext() != null){ // 当前节点的next为null的时候遍历结束
temp = temp.getNext();
}
System.out.println("添加节点到最后: "+heroNode.getNo());
// 将最后一个节点的next指向新节点
temp.setNext(heroNode);
// 新节点的prev指针指向前一个节点
heroNode.setPrev(temp);
}
public void show(){ // 遍历链表
System.out.println("显示全部节点: ");
if (isEmpty()) {
System.out.println("链表为空!");
return;
}
HeroNode02 temp = head.getNext();
while (temp!=null){
System.out.println(temp);
temp = temp.getNext();
}
}
public HeroNode02 getOne(Integer no){ // 根据no查询节点
if (isEmpty()) {
System.out.println("链表为空!");
return null;
}
HeroNode02 temp = head.getNext();
while(!Objects.equals(temp.getNo(), no)){
temp = temp.getNext();
if (temp == null){ // 如果遍历链表也查不到 那么返回null
System.out.println("查无此节点!");
return null;
}
}
return temp;
}
public void update(Integer no,String name,String nickName){ // 修改节点data域
if (isEmpty()) {
System.out.println("链表为空!");
return;
}
HeroNode02 heroNode = getOne(no);
heroNode.setName(name);
heroNode.setNickname(nickName);
}
public void deleteNode(Integer no){ // 删除节点
if (isEmpty()) {
System.out.println("链表为空!");
return;
}
HeroNode02 temp = head.getNext();
/**
* 想要删除一个节点: 1.将该节点的前一个节点的next指向删除节点的下一个节点
* 2. 将该节点删除(释放内存,在Java里这一步由JVM垃圾回收器执行)
*/
while (!Objects.equals(temp.getNo(), no)){
temp = temp.getNext();
if(temp == null){
System.out.println("查无此节点!");
return;
}
}
System.out.println("删除节点: "+no);
if (temp.getNext()!=null){ // 当前节点不是最后节点
temp.getPrev().setNext(temp.getNext());
temp.getNext().setPrev(temp.getPrev());
}else { // 若当前节点是最后一个节点时,只需要修改倒数第二个节点的next指针
temp.getPrev().setNext(null);
}
}
}
class HeroNode02{
private Integer no; // 排名
private String name;// 姓名
private String nickname;// 外号
private HeroNode02 next; // 指向后一个节点
private HeroNode02 prev;// 指向前一个节点
public HeroNode02(){}
public HeroNode02(Integer no,String name,String nickname){
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
if (next!=null)
return "[prev: "+prev.getNo()+", No: " +no+", name: "+name+", nickName: "+nickname+", nextNo:"+next.getNo()+
"]";
else
return "[prev: "+prev.getNo()+", No: " +no+", name: "+name+", nickName: "+nickname+", nextNo:"+
" null]";
}
public Integer getNo() {return no;}
public void setNo(Integer no) {this.no = no;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getNickname() {return nickname;}
public void setNickname(String nickname) {this.nickname = nickname;}
public HeroNode02 getNext() {return next;}
public void setNext(HeroNode02 next) {this.next = next;}
public HeroNode02 getPrev() {return prev;}
public void setPrev(HeroNode02 prev) {this.prev = prev;}
}
public class doubleLinkedListDemo {
public static void main(String[] args) {
doubleLinkList doubleLinkList = new doubleLinkList();
doubleLinkList.addNodeByOrder(new HeroNode02(1,"小李1","小黑子1号"));
doubleLinkList.addNode(new HeroNode02(2,"小李2","小黑子2号"));
doubleLinkList.addNode(new HeroNode02(3,"小李3","小黑子3号"));
doubleLinkList.addNode(new HeroNode02(4,"小李4","小黑子4号"));
doubleLinkList.addNode(new HeroNode02(5,"小李5","小黑子5号"));
doubleLinkList.addNode(new HeroNode02(6,"小李6","小黑子6号"));
doubleLinkList.show();
doubleLinkList.deleteNode(3);
doubleLinkList.show();
doubleLinkList.addNode(new HeroNode02(7,"小李7","小黑子7号"));
doubleLinkList.show();
doubleLinkList.deleteNode(7);
doubleLinkList.show();
doubleLinkList.addNodeByOrder(new HeroNode02(3,"小李3","小黑子3号"));
doubleLinkList.show();
}
}