如何在不修改指针的情况下递归地反转单链表?

时间:2016-02-10 05:29:00

标签: algorithm recursion linked-list

最近我接受了采访,面试官要求我在不修改指针的情况下撤销单链表(仅更改值)。 一开始,我想出了一个使用堆栈的解决方案。他说没关系,希望我递归地做。然后我给了他一个O(n ^ 2)解决方案。但他说他需要一个O(n)解决方案。

任何人都可以帮助我?

3 个答案:

答案 0 :(得分:1)

我可以想到这样做的一种方法是递归到最后在另一个列表中累积值,当你转到最后,然后在递归的路上,从列表中的第一个值开始写回值。这将是O(2n)。它与使用堆栈没有太大区别......

答案 1 :(得分:1)

伪代码

reverse (list):
 reverse2 (list, list)

reverse2 (a, b):
 if b != nil:
  a = reverse2 (a, b.next)
  if a != nil:
   swap (a.data, b.data)
   if a == b || a.next == b:
    # we've reached the middle of the list, tell the caller to stop
    return nil
   else:
    return a.next
  else:
   # the recursive step has returned nil, they don't want us to do anything
   return nil
 else:
  # we've reached the end of the list, start working!
  return a

答案 2 :(得分:0)

list = { a => b => c => d }

def recursive(acc, x)
  if !x
    return acc
  end
  acc.preprend(x)

  return recursive(acc, x.next)
end

result = recursive([], list.first)

所以第一个电话是recursive([], a)result现在是[a]

第二个电话是recursive([a], b)result变为[b, a]

第三个电话是recursive([b, a], c)result[c, b, a]

第四个电话是recursive([c, b, a], d)result [d, c, b, a]

第五次通话被if !x抓住。

告诉你的面试官你需要一个额外的结构,就像上面其他人说的那样。