📜  链表操作:遍历,插入和删除(1)

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

链表操作:遍历,插入和删除

什么是链表

链表是一种常见的数据结构,也是算法中的重要内容之一。链表是由一系列节点组成的集合,每个节点都包含两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针。

链表的优点和缺点

链表与数组不同,链表不需要一整块连续的内存空间,它通过指针将一组零散的内存块串联起来使用。链表的这种存储方式可以灵活地分配内存空间,而且插入和删除操作比数组快。

但是链表的缺点也很明显,因为每个节点都需要额外的指针空间,所以链表的内存消耗比较大。而且链表的随机访问效率比较低,因为不能像数组那样通过下标来直接访问元素,而是需要从头开始遍历整个链表,直到找到需要的数据。

遍历链表

要遍历链表,就需要从头节点开始依次遍历到尾节点。可以使用一个while循环来实现链表的遍历,由于链表的头节点指针通常不会变,所以可以定义一个临时指针变量用来遍历整个链表。

ListNode* cur = head;
while(cur != NULL) {
  // 访问cur节点
  cur = cur->next;
}

上面的代码中,head是链表的头节点指针,cur是临时指针变量,用于遍历链表。每次循环结束,cur就指向下一个节点,直到cur指向空节点时,遍历结束。

插入链表

在链表中插入一个新节点,需要执行以下几个步骤:

  1. 创建一个新节点,并设置好它的值;
  2. 找到需要插入的位置,即插入节点前面的那个节点;
  3. 将插入节点的next指向该位置的next指针,将该位置的next指针指向插入节点。
ListNode* newNode = new ListNode(val);
ListNode* cur = head;
while(cur->next != NULL && cur->next->val < val) {
  cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;

上面的代码中,val是要插入节点的值,newNode是创建的新节点指针。首先,使用while循环找到需要插入的位置,即当前节点的下一个节点应该比插入节点的值大,或者已经到达链表的末尾。然后,将newNode的next指针指向cur的next指针,将cur的next指针指向newNode。

删除链表

在链表中删除一个节点,同样需要执行以下几个步骤:

  1. 找到需要删除的节点,即要删除节点的前一个节点;
  2. 将要删除节点的next指针指向当前节点的下一个节点;
  3. 释放要删除的节点的内存空间。
ListNode* cur = head;
while(cur->next != NULL && cur->next->val != val) {
  cur = cur->next;
}
if(cur->next != NULL) {
  ListNode* temp = cur->next;
  cur->next = temp->next;
  delete temp;
}

上面的代码中,val是要删除的节点的值。首先,使用while循环找到要删除的节点的前一个节点。然后,将要删除节点的next指向cur的next指针,将cur的next指针指向要删除节点的下一个节点。最后,释放要删除的节点的内存空间,防止内存泄漏。

总结

链表是一种常见的数据结构,它的优点是插入和删除操作比较快,但是缺点是内存消耗比较大,随机访问效率比较低。在开发过程中,需要根据实际场景来选择合适的数据结构。在使用链表时,需要注意内存泄漏问题,及时释放不再需要的内存空间。