一些遞歸方法:
樸素,O(n)的堆棧存儲器:
node *add_tail(node *list, node *added)
{
if (list == NULL)
return added;
list->next = add_tail(list->next, added);
return list;
}
包裝加尾遞歸函數(可優化循環):
void add_tail_rec(node **list, node *add)
{
if (*list == NULL)
*list = add;
else
add_tail_rec(&(*list)->next, add);
}
node *add_tail(node *list, node *add)
{
add_tail_rec(&list, add);
return list;
}
隨着假頭節點,而不是指針到指針:
void add_tail_rec(node *list, node *add)
{
if (list->next == NULL)
list->next = add;
else
add_tail_rec(list->next, add);
}
node *add_tail(node *list, node *add)
{
node fake;
fake.next = list;
add_tail_rec(&fake, add);
return fake.next;
}
沒有提升到包裝假頭節點或指針到指針,但空試驗的副本:
void add_tail_rec(node *list, node *add)
{
if (list->next == NULL)
list->next = add;
else
add_tail_rec(list->next, add);
}
node *add_tail(node *list, node *add)
{
if (list == NULL)
return add;
add_tail_rec(list, add);
return list;
}
在遞歸函數跟蹤插入位置中帶有額外的上下文參數。用這個技巧,遞歸部分返回一個值:並且該值總是隻有list
!包裝可以使用三元表達式來返回add
或list
(添加了該項目)。
node *add_tail_rec(node *list, node *add, node *where)
{
return where->next == NULL
? (where->next = add, list)
: add_tail_rec(list, add, where->next);
}
node *add_tail(node *list, node *add)
{
return list == NULL ? add : add_tail_rec(list, add, list);
}
來源
2014-03-28 20:07:39
Kaz
不,它不是很相似。你必須通過鏈表才能到達尾部 - 除非你有雙鏈表,這似乎並非如此。 – raina77ow
你的代碼假定'theList'在進入函數時不爲空。是這樣嗎? – Kaz