双向链表

双向链表

在单链表的基础上增加了头指针,可以指向前驱结点,所存储过程中便利很多,可以访问上一个结点。
在使用过程中,插入结点的操作为:
首先先通过遍历结点,找到其位置的前结点pnode.next,然后再进行连接,大致与单链表相同,
但最好按照这样的顺序:
在这里插入图片描述

 dNode.next=pnode.next.next;
            dNode.pre=pnode.next;
            pnode.next.next=dNode;
            pnode.next.next.pre=dNode;

删除操作大致相同:

 pnode.next.next=pnode.next.next.next;
        pnode.next.next.pre=pnode.next;

全部代码如下:

package List;

import java.awt.dnd.DnDConstants;
import java.security.cert.PolicyNode;

class DNode extends Node{
    DNode next;
    DNode pre;

    public DNode(Object data) {
        this.setData(data);
    }
    public DNode(){}
}
public class dlinkedlist {
    DNode rnode;
    DNode root;
    public void dlinkedlist_init(){
        root=new DNode();
        rnode=new DNode();
        root.next=null;
        root.pre=null;
        root.setData(null);
        rnode.next=root;
    }
    public void dlinkedlist_insert(Object data){
        //顺序添加,不在指定插入
        DNode dNode=new DNode(data);
        dNode.next=null;
        dNode.pre=rnode.next;
        rnode.next.next=dNode;
        System.out.println("dNode.pre.getData():"+dNode.pre.getData()+",dNode.getData():"+ dNode.getData());
        rnode.next=dNode; 
    }
    public void dlinkedlist_insert(int n,Object data){
        DNode dNode=new DNode(data);
        DNode pnode=new DNode();
        pnode.next=root;

        int i=1;
        while (i<=n-1){
         pnode=pnode.next;
         i++;
        }if(pnode.next.next!=null){
            dNode.next=pnode.next.next;
            dNode.pre=pnode.next;
            pnode.next.next=dNode;
            pnode.next.next.pre=dNode;
            System.out.println("dNode.getData():"+dNode.getData());
            System.out.println("dNode.pre.getData():"+dNode.pre.getData());
            System.out.println("dNode.next.getData():"+dNode.next.getData());
        }
      else {
            dNode.next=null;
            dNode.pre=rnode.next;
            pnode.next.next=dNode;
            System.out.println("dNode.getData():"+dNode.getData());
            System.out.println("dNode.pre.getData():"+dNode.pre.getData());

        }
    }
    public void delete(int n){
        DNode pnode=new DNode();
        pnode.next=root;
        int i=1;
        while (i<=n-1){
            pnode=pnode.next;
            i++;
        }
        System.out.println("删除的结点数据为;"+pnode.next.next.getData());
        pnode.next.next=pnode.next.next.next;
        pnode.next.next.pre=pnode.next;
    }
    public void print(){
        DNode dNode=new DNode();
        dNode.next=root;
        while (dNode.next.next!=null){
            System.out.println(dNode.next.next.getData());
            dNode=dNode.next;
        }
    }
    public static void main(String[] args){
        dlinkedlist dl=new dlinkedlist();
        dl.dlinkedlist_init();
        dl.dlinkedlist_insert(1);
        dl.dlinkedlist_insert(2);
        dl.dlinkedlist_insert(3,3);
        dl.print() ;
        dl.delete(2);
        dl.print() ;
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值