反转API设计:
public void reverse():对整个链表反转
public Node reverse(Node curr):反转链表中的某个结点,并把反转后的curr结点返回
使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点,直到把最后一个结点反转完毕,整个链表就反转完毕。
反转方法:
//反转整个链表
public void reverse(){
if(isEmpty()){ //判断当前链表是否为空链表,如果是空链表,则停止运行,否则调用重载的reverse方法完成反转
return;
}
reverse(head.next);
}
//反转指定结点curr
public Node reverse(Node curr){
if(curr.next==null){
head.next=curr;
return curr;
}
//递归的反转curr结点的下一个结点,返回值就是链表反转后,当前结点的上一个结点
Node pre=reverse(curr.next);
//让返回节点的下一个节点变为当前节点curr
pre.next=curr;
//把当前节点的下一结点变为null
curr.next=null;
return curr;
}
测试:
package cn.itcast.algorithm.linearTest;
import cn.itcast.algorithm.linear.LinkList;
public class LinkListTest2 {
public static void main(String[] args) {
LinkList<String> s1 = new LinkList<>();
//创建单链表表对象
s1.insert("吴磊");
s1.insert("ASD");
s1.insert("Messi");
s1.insert(1,"詹姆斯");
for(String s:s1){
System.out.println(s);
}
System.out.println("------------------------");
System.out.println("反转后的链表:");
s1.reverse();
for(String q:s1){
System.out.println(q);
}
}
}
测试结果: