4.4 链表 → 链表的反转
链表反转肯定是 单链表呀!因为 双链表 和 循环链表 完全不需要反转。。
单链表的反转,是面试中的一个高频题目。
-
需求:
原链表中数据为∶1->2->3->4
反转后链表中数据为∶4->3->2->1 -
反转API:
public void reverse():对整个链表反转
public Node reverse(Node curr)∶反转链表中的某个结点curr,并把反转后的curr结点返回
使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点,直到把最后一个结点反转完毕,整个链表就反转完毕。
- 调用reverse(Node curr)方法反转每一个结点,从元素1结点开始;
- 如果发现curr还有下一个结点,则递归调用reverse(curr.next)对下一个结点反转;
- 最终递归的出口是元素4结点,因为它没有下一个元素了,当到了出口处,让head指向元素 4 结点,共递归调用4次。
- 递归开始返回;
//null 1 2
public Node reverse(Node curr)
{
if(curr.next == null)
{
head.next = curr;
return curr;
}
return reverse(curr.next).next = curr;
}
public void reverse()
{
reverse(head.next).next = null;
}
这个 递归 其实 还算不难,算是 入门级的。主要是 有一个 条件 你是不可能在 递归的时候 填入的。那就是 最后一步,你必须让 最后一个结点 的 next 值 = null !!!(哈哈~ 是不是 挺懵的。当初我在写的时候 也是很懵。一直都 输出循环的值,甚至输出不出来,后来才发觉 忽略了 尾结点 为 null)
在递归的时候,一定要注意 头结点.next