我的一位高级管理人员问我,可以在不使用循环的情况下撤销单链表吗?如果有,怎么样?他的笑容似乎告诉我这是可能的,但我什么都想不到。有人想过这个吗?
答案 0 :(得分:4)
可以通过交换它的head
和tail
指针来反转 O(1)中的双链表,并且(取决于实现)设置某种标志,告诉列表现在应该向后迭代(即遵循back
指针向前迭代,然后跟随next
指针向后迭代)。
对于单链表,我认为不可能比 O(n)更快地逆转它。
答案 1 :(得分:2)
递归方法
struct node {
int value;
struct node* next;
};
struct node** _reverse(struct node* n)
{
if (NULL != n->next)
*_reverse(n->next) = n;
return &(n->next);
}
// this is the entry
void reverse(struct node* head)
{
*_reverse(head) = NULL;
}
答案 2 :(得分:1)
在STL中,有rbegin()和rend()迭代器,用于以相反的顺序遍历集合。但它不适用于单个链表。