今天温习数据结构,用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出来的是一个单链表从0到20
我们用这个表示
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; //用p把0右边的数据保存下来 第一轮保存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了 这是第一轮 完成后如下
// 1(q)->0(head)->2->3
}
然后我们做第二轮
while(head.next!=null) //当0的右边还有node 2时
{
p=head.next; //用p把0右边的数据保存下来 第二轮保存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