反转API设计:
public void reverse():对整个链表反转
public Node reverse(Node curr):反转链表中的某个结点,并把反转后的curr结点返回
使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点,直到把最后一个结点反转完毕,整个链表就反转完毕。
反转方法:
//反转整个链表public void reverse(){if(isEmpty()){ //判断当前链表是否为空链表,如果是空链表,则停止运行,否则调用重载的reverse方法完成反转return;}reverse(head.next);}//反转指定结点currpublic Node reverse(Node curr){if(curr.next==null){head.next=curr;return curr;}//递归的反转curr结点的下一个结点,返回值就是链表反转后,当前结点的上一个结点Node pre=reverse(curr.next);//让返回节点的下一个节点变为当前节点currpre.next=curr;//把当前节点的下一结点变为nullcurr.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);}}
}
测试结果: