递归地反转链表

时间:2012-03-16 15:10:12

标签: algorithm recursion

问题是我需要编写一个递归算法来反转单链表L,这样节点的排序就会相反。 它似乎有点抽象,但我不需要代码或任何东西,因为问题请求算法,我有点卡住。 我不知道是不是要开始,我的意思是我有一些关于链表的简单事情,比如添加到前面和删除但是,反转(尤其是递归)看起来像墙。

3 个答案:

答案 0 :(得分:2)

由于你不需要提供特定的代码,如果我甚至给你伪代码,我会做你的功课,所以我会给你一些提示; - )

一般方法是做

  1. 覆盖基本案例(如果给定列表为空,则返回空列表)
  2. 递归并扭转尾巴
  3. 将头部贴在反向尾部。
  4. 要反转1 -> 2 -> 3,它就像

      reverse(1 -> 2 -> 3)
    = reverse(2 -> 3) -> 1
    = reverse(3) -> 2 -> 1
    = reverse() -> 3 -> 2 -> 1
    = emptyList -> 3 -> 2 -> 1
    = 3 -> 2 -> 1
    

答案 1 :(得分:1)

考虑双节点列表的简单情况:A-> B-> NULL。您如何反转该列表以使其变为B-> A-> NULL?

如果你仍然无法得到它,想象一堆Legos是一个链表。通过断开连接和重新连接连音来执行现实生活中的重新排序,并记下您执行的每个步骤。

答案 2 :(得分:0)

让我们定义一个方法reverse(L, n),它反转L中的第一个n ≤ L.size()节点,并在L (end = null if n = L.size())中的第n个节点后面的节点返回指针结束{{1}我们完成了,所以让我们假设L至少有2个节点。如果是L.size() ≤ 1,那么我们返回n = 1否则,我们递归调用L.first().next()并让end表示返回L中指向第n个节点的指针。然后我们将ret设置为reverse(L, n - 1) if { {1}},否则为null。然后我们在L的前面插入end指向的节点,然后返回ret。

仅供参考,总运行时间为O(n)。