双向循环链表的实现详解

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

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

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

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

双向循环链表的实现详解_第1张图片

        //原来的下一个节点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)

你可能感兴趣的:(算法编程)