最近我接受了采访,面试官要求我在不修改指针的情况下撤销单链表(仅更改值)。 一开始,我想出了一个使用堆栈的解决方案。他说没关系,希望我递归地做。然后我给了他一个O(n ^ 2)解决方案。但他说他需要一个O(n)解决方案。
任何人都可以帮助我?
答案 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
抓住。
告诉你的面试官你需要一个额外的结构,就像上面其他人说的那样。