假设每一个node的结构是:
因为在对链表进行反转的时候,需要更新每一个node的“next”值,但是,在更新 next 的值前,我们需要保存 next 的值,否则我们无法继续。所以,我们需要两个指针分别指向前一个节点和后一个节点,每次做完当前节点“next”值更新后,把两个节点往下移,直到到达最后节点。
上面代码使用的是非递归方式,这个问题也可以通过递归的方式解决。代码如下:
递归的方法其实是非常巧的,它利用递归走到链表的末端,然后再更新每一个node的next 值 (代码倒数第二句)。 在上面的代码中, reverseRest 的值没有改变,为该链表的最后一个node,所以,反转后,我们可以得到新链表的head。
把问题规模减小,并且减小的量为1
假设我们的程序能够正常的反转:则反转后为
反转后,1元素并没有任何操作,所以反转1的next仍然指向2,
假设2开头的链表已经反转成功,接下来只要将2的next指向1,
看似复杂的问题,把如此多的指针反过来指,其实只要将两个节点反过来即可。
* head为待反转链表的头结点 * @return 反转后的链表头结点,当然该链表也是以null结尾 //把上两个特殊情况合起来 //假设函数能够反转链表,返回头结点 //此时如图4状态,1的getNext就是第二个结点2, //把第二结点2的next指向head则实现把2的指针指向1,如图5 //取出传入数据的第一个结点 //取走一个元素后,从第二个元素创建一个链表, //因为返回的是Node,所以用Node来接收 //假设传入来的List有一个元素,则走到这里时sublist传入的两个参数相等 //与我们期望返回值一致 // //第一个结点的next指向规模缩小的链表返回来的头结点 //上面两行代码清理成如下代码