在线和书籍我发现了一些关于使用迭代方法反转列表的算法,像这样我认为这是常用的算法
link listReverse(link x) {
link t, y = x, r = NULL;
while (y != NULL) {
t = y->next;
y->next = r;
r = y;
y = t;
}
return r;
}
注意:节点以这种方式实现:
typedef sturct node *link:
struct node {
item Item;
link next;
};
我在弄清楚这个算法是如何工作的时候遇到了一些问题,我做了这个:
link init() {
link x;
x = malloc(sizeof *x);
x->next = NULL;
return x;
}
link listReverse(link start) {
link newNode = init();
listReverseR(start, newNode, 1);
return newNode;
}
link listReverseR(link start, link n, double start_d) {
if (start == NULL)
return n;
n = listReverseR(start->next, n, 0);
n->next = (start_d) ? NULL : start;
return n->next;
}
好吗?复杂性是否相等?迭代的是O(n),我认为这也是O(n)。
P.S。递归代码基于带有虚拟头的列表,因此init()函数将此虚拟节点初始化为新列表的开头。