链表用非递归实现反转如图:
首先指针H迭代到底如下图所示,并且设置一个新的指针作为翻转后的链表的头。由于整个链表翻转之后的头就是最后一个数,所以整个过程NewH指针一直指向存放5的地址空间。
然后H指针逐层返回的时候依次做下图的处理,将H指向的地址赋值给H->next->next指针,并且一定要记得让H->next =NULL,也就是断开现在指针的链接,否则新的链表形成了环,下一层H->next->next赋值的时候会覆盖后续的值
继续返回操作:上图第一次如果没有将存放4空间的next指针赋值指向NULL,第二次H->next->next=H,就会将存放5的地址空间覆盖为3,这样链表一切都大乱了。接着逐层返回下去,直到对存放1的地址空间处理。
返回到头
//递归实现链表反转
public class Node {
int data;
Node next;
static Node reverseList(Node head){
if(head==null||head.next==null)
return head;
Node newList = reverseList(head.next);
Node t1 = head.next;
t1.next = head;
head.next = null;
return newList;
}
Node(int x){
data=x;
}
//创建链表
public void add(int x){
Node newNode=new Node(x);//创建值为x的结点
if(this.next==null)
this.next=newNode;//若为空直接添加结点
else this.next.add(x);//若不为空add()添加
}
//打印链表
public void print(){
System.out.print(this.data);
if(this.next!=null){
System.out.print("-->");
this.next.print();
}
}
public static void main(String[] args) {
Node n1=new Node(1);
n1.add(2);
n1.add(3);
n1.print();
System.out.println();
reverseList(n1).print();
}
}