双向循环链表的实现详解

双向循环链表直接体现为  双向和循环,一般的单链表只有节点数据data和next指向地址(应该也是引用的意思),而在此需要增加前面部分的pre指向地址,同时还需要循环

循环则在定义节点时可以解决,如下所示

即假想只有一个节点的时候,不论是上一个节点的指向还是下一个节点的指向都是自己。

双向可以假想三个节点,实际上就是3个节点之间完成pre和next的指向替换,如下图所示

        //原来的下一个节点2的表示
        DoubleLoopNode nextNode =next;
        //把新节点作为节点1的下一个节点
        this.next = node;
        //把节点1当作新节点的pre
        node.pre = this;
        //将节点2作为新节点的下一个指向
        node.next = nextNode;
        //将新节点作为节点2 的上一个指向
        nextNode.pre = node;

这样以来就完成了双向循环链表。具体代码如下

public class DoubleLoopNode {
	//上一个节点
	DoubleLoopNode pre=this;
	//下一个节点
	DoubleLoopNode next=this;
	//循环的体现  pre=this   next=this
	//数据
	int data;
	//构造函数
	public DoubleLoopNode(int data) {
		this.data=data;
	}
	//增加节点
	//      | pre|data|next|  原来节点1(this)
	
	//      | pre|data|next|   node新节点
	
	//      | pre|data|next|  原来节点2
	
	public void after(DoubleLoopNode node) {
		//原来的下一个节点2的表示
		DoubleLoopNode nextNode =next;
		//把新节点作为节点1的下一个节点
		this.next = node;
		//把节点1当作新节点的pre
		node.pre = this;
		//将节点2作为新节点的下一个指向
		node.next = nextNode;
		//将新节点作为节点2 的上一个指向
		nextNode.pre = node;
		
	}
	public DoubleLoopNode next() {
		return this.next;
	}
	public DoubleLoopNode pre() {
		return this.pre;
	}
	public int getData() {
		return this.data;
	}
}

 

测试代码及结果

        
DoubleLoopNode n1 = new DoubleLoopNode(1);
DoubleLoopNode n2 = new DoubleLoopNode(2);
DoubleLoopNode n3 = new DoubleLoopNode(3);
DoubleLoopNode n4 = new DoubleLoopNode(4);
		
n1.after(n2);
n2.after(n3);
System.out.println(n1.next.getData());
System.out.println(n1.pre.getData());

最后显示的结果为2,3

n1、n2、n3三个节点循环相接,n1的前一个节点为n3(3),n1的下一个节点为n2(2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值