从单链表中获取第n个值

时间:2018-02-24 13:30:51

标签: linked-list

如果我们在末尾插入节点,那么它很简单,但如果我在开头插入节点怎么办?我想到的一个解决方案是使其与最后插入时相同,然后反转列表,但我对更好的解决方案感兴趣。感谢

1 个答案:

答案 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;
}