单向列表及其逆转详细研究

今天温习数据结构,用java写了个单链表,当然其他的插入删除什么的比较简单,但到了reverse这块的时候给卡住了,想了半天才明白。但仔细想想其实很明白,如果参考一个图标。

下边是代码。

package datastructure;

 

public class Node2 {

    Node2 next=null;

    int data;

    public Node2(int data){

       this.data=data;

    }

    public static Node2 createList(){

       Node2 head = new Node2(0);

       Node2 point=head;

       Node2 tail = head;

       head.next=tail;

       for(int i=1;i<=20;i++){

           point.next=new Node2(i);

           point=point.next;

       }

       tail=point;

       tail.next=null

       ;

       return head;

    }

    public static void printlist(Node2 node){

       System.out.println(node.data);

       while(node.next!=null)

       {

       System.out.println(node.next.data);

       node=node.next;

       }

    }

    public static Node2 reverseNode(Node2 head){

       Node2 p=null;

       Node2 q=head;

       while(head.next!=null)

       {

           p=head.next;

           head.next=p.next;

           p.next=q;

           q=p;

       }  

      

       return q;}

    /**

     * @param args

     */

    public static void main(String[] args) {

       Node2 head=createList();

       printlist(head);

       head=reverseNode(head);

       printlist(head);

       // TODO Auto-generated method stub

 

    }

 

}

 

重点是reverse这部分,画一个图来分步解析reverse是如何具体实现的。

 

如我代码中所写,create出来的是一个单链表从020

我们用这个表示

0 ->1->2->3->4…->20

Head                 tail

reverse这部分具体作用是

 

Node2 p=null;//p用来存储将被移位的node

       Node2 q=head; //q用来定位处在中心位置的分水岭,它永远指向被移到左边的最大数,直到所有的0右边的node被移到左边(往下看) head位置永远不变

       while(head.next!=null) //0的右边还有node

       {

p=head.next;         //p0右边的数据保存下来 第一轮保存1 p依然//指向2

           head.next=p.next;    //摘除1,把0指向2 0->2->3…   此时p=1->2

           p.next=q;            //P指向0 也就是 1->0->2->3…

           q=p;                 //现在q=1 这是第一轮 完成后如下

                                //  1q->0(head)->2->3

       }  

然后我们做第二轮

while(head.next!=null) //0的右边还有node 2

       {

p=head.next;         //p0右边的数据保存下来 第二轮保存2 p

 //指向3

           head.next=p.next;    //摘除2,把0指向3 0->3…   此时p=2->3

           p.next=q;            //P指向1 也就是 2->1->0->3…

           q=p;                 //现在q=2 这是第二轮 完成后如下

    //  2(q)->1->0(head)->3…

       }  

这样一轮轮下去 所有0右边的数据都被扔到左边 从新排列 最后返回最后一个被扔的20 作为新的head

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值