双向循环链表的实例
关于123456输出456123的改进:
在第一篇博客中,使用了数组的方法,在过程中,通过创建一个中间变量来覆盖每个数组位置的值,来达到数据的更新,但这种大的变动在使用中,会很繁琐,每输出一种形式就需要重新改变数据,而这很明显是一个输出的问题,而不应该改变数据本身的值。
因此在循环链表中可以很好的解决这种问题。循环链表中,,每个结点的数据不需要改变,而通过让改变标记第一个输出数据的位置,即可完成按一定顺序输出。
代码如下:
链表初始化,使得26个英文字母存入链表,并使得最后一结点连向头结点的下一结点,成为双向循环链表。
DNode root;
//输入3实现DEFGHLMJKLMNOPQRSTUVWXYZABC的输出
//输入-3实现XYZABCDEFGHLMJKLMNOPQRSTUVW的输出
public void test_init(){
root =new DNode();
//初始化为双向循环链表,头结点的pre指向尾结点
root.setData(null);
root.next=root;
root.pre=root;
char word='A';
for(int i=0;i<=25;i++){
DNode dNode=new DNode(word++);
dNode.next=root;
dNode.pre=root.pre;
root.pre.next=dNode;
root.pre=dNode;
System.out.print(dNode.getData()+",");
}
root.pre.next=root.next;
root.next.pre= root.pre;
}
输出模块:
当输入正数时,表示从第n+1个结点开始输出,
当输入负数时,表示从第倒数n个结点开始输出,
如 3 ,DEFG…ABC
-3 ,XYZABC…
定义两个指针,指向需要输出的位置,一个用来标记第一个输出的位置,另一个指针来指向当前输出结点。
public void test_print(int n){
int i=0;
DNode pnode=new DNode();
//pnode1指向输出位置
DNode pnode1=new DNode();
pnode.next=root.next;
if(n>=0){
while(i<n){
pnode.next=pnode.next.next;
i++;
}
pnode1.next=pnode.next;
while (pnode.next.next!=pnode1.next){
System.out.print(pnode.next.getData()+",");
pnode.next=pnode.next.next;
}
System.out.print(pnode.next.getData());
}
if(n<0){
while(i>n){
pnode.next=pnode.next.pre;
i--;
}
pnode1.next=pnode.next;
while (pnode.next.next!=pnode1.next){
System.out.print(pnode.next.getData()+",");
pnode.next=pnode.next.next;
}
System.out.print(pnode.next.getData());
}
}
运行结果如下: