10,java双向链表基础代码复现

双向链表总体来说和单链表差别不大,最大的区别就是node结构中多了一个pre指针(变量)指向前一个节点,因为有了之前的单链表基础,双向链表的复现问题少了很多,基本可以不参考老师的代码自主写下来。

1、添加函数(加入到链表最后)

因为此处的添加只需加到最后即可,按照单链表的添加,遍历到最后并更改辅助节点的next指向node和node的pre指向temp即可。

public void add(teamNode1 node){
        teamNode1 temp=head;
        while(true){
            if(temp.next==null) break;
            temp=temp.next;
        }
        temp.next=node;
        node.pre=temp;
    }

2、显示函数(打印出链表内的所有节点)

今天测试的时候发现昨天好像写错了- -,今天发现最后一个节点的信息无法被打印。后来发现,判断next为null的语句不同于其他函数,此处应该放在输出语句之后,后移语句之前。

public void list(){
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        teamNode1 temp=head.next;
        while (true){
            System.out.println(temp);
            if(temp.next==null) break;
            temp=temp.next;
        }
    }

3、更新函数 与单链表的修改函数完全一致

public void update(teamNode1 node){
        teamNode1 temp=head;
        boolean flag=false;
        while (true){
            if(temp.next==null) break;
            if(temp.no==node.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            temp.name=node.name;
            temp.point=node.point;
        }else {
            System.out.println("未找到要修改的队伍");
        }
    }

4、删除函数

此处与单链表有较大不同,双向链表可实现自我删除,遍历到要删除的节点即可,而非要删的节点的前一个节点。但有个要注意的就是当要删除的函数为链表最后一个函数时,temp的next节点l为空,没有pre指针,也无法将pre指向node,所以在修改前要先判断。

public void delete(int n){
        if(head.next==null) {
            System.out.println("链表为空无法删除");
            return ;
        }
        boolean flag=false;
        teamNode1 temp=head;
        while(true){
            if(temp.next==null) break;
            if(temp.no==n){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag&&temp.next!=null){
            temp.pre.next=temp.next;
            temp.next.pre=temp.pre;
        }else if(flag){
            temp.pre.next=temp.next;
        }else {
            System.out.println("未找到该位置队伍,无法删除");
        }
    }

5、按顺序加入函数 双向链表addbyorder

思路和单链表的按顺序插入相似,此处的加入到中间,需要先用temp.next.no> node.no找到应该插入的位置与插入位置前一个节点的temp,然后从后往前更改,先更改temp的next节点即要插入位置的后一个节点名为last,将它的pre指向node。然后更改node的next指向last,更改node的pre指向temp,最后更改temp的next指向node。这是比较顺的思路,不会导致有用的信息被覆盖掉。

另外的,与删除链表相对应,此处要多考虑一种加入时要加入到链表尾部时的情况,相对于上面的情况,就不存在last这个节点了,因此不用修改node的next和last的pre。

因为情况比较多,我放弃了布尔值的标识符,用int的标识符,赋予123值来区分情况,1为需要插入,即前后都有节点,2为链表中已有该编号队伍,0为遍历到最后发现没有编号大于他的节点,也没有等于它的节点,所以就是要加在结尾。

public void addbyorder(teamNode1 node){
        teamNode1 temp=head;
        int flag=0;
        while (true){
            if (temp.next==null) break;
            if(temp.next.no== node.no){
                flag=2;
                break;
            }
            if (temp.next.no> node.no){
                flag=1;
                break;
            }
            temp=temp.next;
        }
        if(flag==1){
            temp.next.pre=node;
            node.next=temp.next;
            node.pre=temp;
            temp.next=node;
        }else if(flag==0){
            temp.next=node;
            node.pre=temp;
        }else {
            System.out.println("已有该队伍");
        }
    }

 

posted @ 2022-03-23 16:56  水煮小白菜  阅读(30)  评论(0编辑  收藏  举报