如果我们在末尾插入节点,那么它很简单,但如果我在开头插入节点怎么办?我想到的一个解决方案是使其与最后插入时相同,然后反转列表,但我对更好的解决方案感兴趣。感谢
答案 0 :(得分:0)
在您的问题中,项目(节点)将与插入的顺序相反。对于“简单”的正向和反向遍历,您确实需要一个双链表(next和prev指针)。要使用单个链表执行您所要求的操作,有几种可能性。您可以遍历列表,最多只保留堆栈中的n个项目然后打印堆栈,但当然您还需要堆栈数据结构。如果最后一个不是太大你可以使用递归。如果它太大你将得到Stack Overflow :)。这是C中的一个例子:
struct Node
{
int value; // Assume int values in list
Node *next;
};
typedef struct
{
struct Node* first;
} List;
// This is a recursive function which will first work its way to the end
// of the list and print n elements on the way back out. You can replace
// printing with any processing you want.
int print_first_n(struct Node *p, int n)
{
if (p == NULL) return n;
if (p->next != NULL) n = first_n(p->next, n);
if (n > 0)
{
printf("%d\n", p->value);
n -= 1;
}
return n;
}
int main(int argc, char *argv[])
{
List list = {NULL};
// (populate list - insert at beginning of list)
// Print first 10 elements inserted
print_first_n(list.first, 10);
return 0;
}