链表反转
单链表的反转,是面试中一个高频题目
原理分析
使用递归完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,一次递归调用反转每一个结点,知道把最后一个结点反转完毕,整个链表就反转完毕。
1.调用reverse(Node curr)方法反转每一个结点,从元素1结点开始
2.如果发现curr还有下一个节点,则递归调用reverse(curr.next)对下一个节点进行反转
3.最终递归的出口是,next为null,让head节点指向最后一个元素节点
4.递归开始返回
代码实现
//用来反转整个链表
public void reverse(){
//判断当前链表是否为空链表,如果是空链表,则结束运行,如果不是,则调用重载的reverse方法完成反转
if (isEmpty()){
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;
}
测试
public class TestLinkList {
public static void main(String[] args) {
LinkList<String> list = new LinkList<String>();
list.insert("姚明");
list.insert("科比");
list.insert("库里");
list.insert("乔丹");
list.reverse();
for (Object o : list) {
System.out.println(o);
}
}
}