双链表的增删改查

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, "小黄", "小黄
上一篇:QT QStandardItemModel 数据修改时 触发


下一篇:Python:Django3x分页分个明白