ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

双链表的增删改查

2021-12-23 13:34:29  阅读:222  来源: 互联网

标签:temp 改查 HeroNode heroNode next 增删 num 双链 previous


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, "小黄", "小黄

标签:temp,改查,HeroNode,heroNode,next,增删,num,双链,previous
来源: https://blog.csdn.net/weixin_52875557/article/details/122104457

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有