📜  在链表的特定位置插入节点(1)

📅  最后修改于: 2023-12-03 15:37:47.344000             🧑  作者: Mango

在链表的特定位置插入节点

在链表中插入新节点是一个常见的操作,通常有两种方法:在链表的头部插入节点和在链表的尾部插入节点。但有时候,我们需要在链表的特定位置插入节点,本文将介绍如何在链表的特定位置插入节点。

代码实现

我们可以首先定义一个链表结构体:

typedef struct Node {
  int data;
  struct Node* next;
} Node;

假设我们已经定义好了链表的头节点 head,我们需要定义一个插入节点的函数:

void insertNode(Node* head, int index, int data) {
}

函数接收三个参数:链表头节点 head,插入节点的位置 index 和插入节点的数据 data

首先我们需要找到插入位置的前一个节点 prev,然后将新节点 newNode 插入到 prevprev->next 之间。如果链表长度小于插入位置 index,则不插入节点。

完整代码如下:

void insertNode(Node* head, int index, int data) {
  int i = 0;
  Node* p = head;
  while (p && i < index - 1) {
    p = p->next;
    i++;
  }

  if (i != index - 1 || !p) {
    printf("Error: index out of bounds\n");
    return;
  }

  Node* newNode = (Node*)malloc(sizeof(Node));
  newNode->data = data;
  newNode->next = p->next;
  p->next = newNode;
}
示例

下面是一个示例程序,我们在链表的第三个位置插入一个值为5的节点。

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
  int data;
  struct Node* next;
} Node;

void insertNode(Node* head, int index, int data) {
  int i = 0;
  Node* p = head;
  while (p && i < index - 1) {
    p = p->next;
    i++;
  }

  if (i != index - 1 || !p) {
    printf("Error: index out of bounds\n");
    return;
  }

  Node* newNode = (Node*)malloc(sizeof(Node));
  newNode->data = data;
  newNode->next = p->next;
  p->next = newNode;
}

void printList(Node* head) {
  Node* p = head->next;
  while (p) {
    printf("%d ", p->data);
    p = p->next;
  }
  printf("\n");
}

int main() {
  Node* head = (Node*)malloc(sizeof(Node));
  head->next = NULL;

  Node* n1 = (Node*)malloc(sizeof(Node));
  n1->data = 1;
  n1->next = NULL;
  head->next = n1;

  Node* n2 = (Node*)malloc(sizeof(Node));
  n2->data = 2;
  n2->next = NULL;
  n1->next = n2;

  Node* n3 = (Node*)malloc(sizeof(Node));
  n3->data = 3;
  n3->next = NULL;
  n2->next = n3;

  insertNode(head, 3, 5);

  printList(head);

  return 0;
}

运行结果:

1 2 3 5 
总结

在链表的特定位置插入节点需要注意以下几点:

  1. 找到插入位置的前一个节点。
  2. 判断链表长度是否小于插入位置。
  3. 插入新节点并更新前一个节点的 next 指针。
  4. 释放新节点的内存空间。

通过以上几点的处理,我们就能够在链表的特定位置插入节点了。