双链表的增删改查

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 + '\'' +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天你学习了ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值