Java 双链表的指定添加、删除数据的详细实现

定义双链表

 //定义双链表
    private static class DoubleLink{
        int data;
        DoubleLink pre;
        DoubleLink next;
        DoubleLink(){
        }
        DoubleLink(int data){
            this.data=data;
        }
    }

初始化双链表

 //初始化双链表
    private static DoubleLink initLink(int [] arr,DoubleLink link){
        DoubleLink head=link;
        int i=0;
        if (head==null) head= new DoubleLink();
        int len =getLen(link);
        while (i<arr.length){
            DoubleLink tmp=new DoubleLink(arr[i]);
            head.next=tmp;
            tmp.pre=head;
            head=head.next;
            i++;
        }
        return link.next;
    }

正向打印双链表

//正向打印双链表
    private  static void printLink(DoubleLink link){
        DoubleLink head =link;
        int i=0;
        while (head!=null){
            i++;
            System.out.println("第"+i+"个数是"+head.data);
            head=head.next;
        }
    }

反向打印双链表

 //反向打印双链表
    private  static void reversePrintLink(DoubleLink link){
        DoubleLink head =link;
        int i=getLen(link);
        while (head.next!=null){
            head=head.next;
        }
        DoubleLink tail =head;
        while (tail.pre!=null){
            System.out.println("第"+i+"个数是"+tail.data);
            tail=tail.pre;
            i--;
        }
    }

指定插入数据

//指定位置插入数据 dataLink需要插入的数据,index插入的位置
    private static DoubleLink insertDataIndex(DoubleLink link, DoubleLink dataLink,int index){
        DoubleLink head =link;
        int len =getLen(link);
        if(len<1||index>len+1){
            System.out.println("原链表不满足条件!");
            return link;
        }
        else if (index==1){
            dataLink.next=head;
            head.pre=dataLink;
            return dataLink;
        }
        else{
            int i=1;
            while (i<index-1){
                head=head.next;
                i++;
            }
            DoubleLink cur =head.next;
//            System.out.println(cur.data);
            if (cur.next!=null){
                cur.pre.next=dataLink;
                dataLink.pre=cur.pre.next;
                dataLink.next=cur.next.pre;
            }
            if (cur.next==null){
                cur.next=dataLink;
                dataLink.pre=cur.next;
                dataLink.next=null;
            }

        }
        return link;
    }

指定位置删除数据

//指定位置删除数据 index指定的数据位置
    private static DoubleLink delDataIndex(DoubleLink link, int index){
        DoubleLink head =link;
        int len =getLen(link);
        if(index<1||index>len+1){
            System.out.println("指定位置不满足条件!");
            return link;
        }
        else if (index==1){
            DoubleLink tmp=new DoubleLink();
            tmp.next=head.next;
            head.pre=tmp;
            return tmp.next;
        }
        else {
            int i=1;
            while (i<index-1&&head!=null){
                head=head.next;
                i++;
            }
            DoubleLink cur =head.next;
//            System.out.println(cur.data);
            if (cur.next!=null){
                cur.pre.next=cur.next;
                cur.next.pre=cur.pre;
            }
            if (cur.next==null)cur.pre.next=null;
            return link;
        }
    }

主函数

 public static void main(String[] args) {
        //初始化链表
        DoubleLink link =initLink(new int[]{1, 6, 9, 12},new DoubleLink());
        //正向打印链表
        System.out.println("***************正向打印链表为*********************************");
        printLink(link);
        //反向打印链表
        System.out.println("***************反向打印链表为**********************************");
        reversePrintLink(link);
        //指定索引位置添加数据
        System.out.println("**************指定索引位置添加数据后链表为***********************");
        printLink(insertDataIndex(link,new DoubleLink(5),4));
        //指定索引位置删除数据
        System.out.println("**************指定索引位置删除数据后链表为***********************");
        printLink(delDataIndex(link,3));
    }

运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值