双向循环链表(关于123456输出456123问题的改进)

双向循环链表的实例

关于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());
        }

    }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值