啊 就因为我实现单链表时多一个头结点 差点…平安夜快乐 虽然是明天晚上 不过是我梦开始的时间。
package com.zhang;
public class Solution {
//先构造一个简单的单链表
private class LinkNode{
int val;//值域
LinkNode next;//下一个节点引用
public LinkNode() {
this.next = null;//初始化
}
public LinkNode(int val) {
this.val=val;
this.next=null;
}
}
//创造一个链表头结点并返回
public LinkNode create(){
LinkNode head = new LinkNode();//初始化的事情可以放在它的无惨构造
return head;
}
//往链表中添加元素 尾插
public boolean add(int val,LinkNode ph){
//找到链表结尾
while (ph.next!=null){
ph=ph.next;
}
//创造新节点 初始化事情可以放在LinkNode的有参构造里
LinkNode pNew = new LinkNode(val);
ph.next = pNew;
return true;
}
private int i=0; //记录方法的调用次数
private LinkNode ph; //记录头结点 因为互换从首结点开始
//链表反转 递归实现
public LinkNode reverseLink(LinkNode pf) {
/*
*f(0)->f(1)->f(2)...f(n)
*求 f(n)->f(n-1)...f(0)
*/
//记录头结点 因为我的链表头结点和首结点不是一个结点
if(this.i==0){this.ph=pf; pf=this.ph.next;}
this.i=2;
//递归实现
if (pf == null || pf.next == null) {//找到最后一个节点
//最后一个节点存入head节点的 next域中返转
ph.next = pf;
return ph;
} ;
//ph 往后移动一位 用pt记录一下
LinkNode pt = pf.next;
LinkNode ret = reverseLink(pt);
//先给自己后面的节点地址域赋值
pf.next.next= pf;
pf.next = null;
return ret;
}
//打印链表
public void showall(LinkNode ph){
while (ph.next!=null){
System.out.print(ph.next.val+",");
ph=ph.next;
}
}
public static void main(String[] args) {
Solution s= new Solution();
LinkNode l = s.create();
s.add(1,l);
s.add(2,l);
s.add(3,l);
s.add(6,l);
s.add(5,l);
s.add(7,l);
s.showall(l);
System.out.println();
System.out.println("---------");
s.showall(s.reverseLink(l));
}
}