【问题标题】:Insert a node at nth vs beginning position LinkedList in C在C中的第n个vs起始位置LinkedList插入一个节点
【发布时间】:2017-11-04 18:44:14
【问题描述】:

所以我正在观看this video series 中关于 C 中的链表的内容,并且正在努力理解它的逻辑。

我想在这里指出的是,在视频(6)中关于如何在开头插入节点我们有这个:

void Insert(int input)
{
 struct Node *newNode = malloc(sizeof(struct Node));
 newNode->data = input;
 newNode->next = start;
 start = newNode;
}

它完成了工作,在打印时我们得到了这个:

  Insert(10);
  Insert(20);
  Insert(30);
  Insert(40);
  Print();

40 30 20 10

在视频 (7) 中关于在第 n 次定位时插入注释我们有这个:

void Insert(int input, int position)
{
  struct Node *newNode = malloc(sizeof(struct Node));
  newNode->data = input;

  if (position == 1)
  {
    newNode->next = start;
    start = newNode;
    return;
  }

  struct Node *runner = start;

  for (int i = 1; i < position-1; i++)
  {
    runner = runner->next;
  }
  
  newNode->next = runner->next;
  runner->next = newNode;

}

打印我们有这个:

  Insert(10,1);
  Insert(20,2);
  Insert(30,3);
  Insert(40,4);
  Print();
10 20 30 40

这是倒置的! 我试图追踪为什么会发生这种情况,发现错误就在这里:

runner->next = newNode;

我们将新节点的地址分配为现有节点的旁边。如果将新节点插入到linkedlist的中间,它可以完美地工作,但是如果它在开头插入,则列表会被反转。

所以我想知道,我怎样才能摆脱这种倒置以及哪种方式是正确的?

【问题讨论】:

  • 一个简单的链表通常以相反的插入顺序排列。新节点位于列表的前面。但是为什么你认为这个列表是“倒置的”?节点被插入到特定位置。
  • 为什么你认为这些印刷品是“倒置的”?他们在我看来是正确的。此外 Insert at position 可能想要检查您是否已到达列表的末尾,而不是假设用户将传递一个有效的位置。
  • @WeatherVane,我认为你是对的。当我们将现有节点的下一个分配为新插入的节点时,它似乎倒置了。但是,是的,如果我总是在第一个位置插入新的点头,它似乎工作得很好而不会被“倒置”。
  • 或许应该从另一端开始计算节点,也就是从start节点往下计算。

标签: c pointers linked-list


【解决方案1】:

其实这是我的逻辑误会。 当一个人在第 n 个位置插入节点时,根据@WeatherVane,列表实际上与插入顺序相反。 (先入先出)

要按“先入后出”的顺序获取它,我们需要在开头堆叠点头:

  Insert(10,1);
  Insert(20,1);
  Insert(30,1);
  Insert(40,1);
  Print();
40 30 20 10

代替:

  Insert(10,1);
  Insert(20,2);
  Insert(30,3);
  Insert(40,4);
  Print();
10 20 30 40

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多