《算法之美》の链表问题の记住头元素+删除元素

本文详细介绍了如何在单向链表中进行插入和删除操作,包括在链表头部插入新元素、删除指定元素及清空整个链表的方法,并提供了具体的C/C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记住头元素:

单向链表的头元素必须至始至终要记住,否则链表将会在内存中丢失。这意味着在链表第一个元素之前插入新元素或删除链表第一个元素时,指向链表头的指针或引用必须更新。

C/C++中,很容易因误用指针而犯错误,如下面代码,它在链表的前面插入一个元素:

bool insertInFront(IntElement *head, int data)

{

         IntElement *newItem = new IntElement;

         if(!newItem)

                   return false;

         newItem->data = data;

         newItem->next = head->next;

         head = newItem;           //错误

         return true;

}

上面的代码是不正确的,因为它只更新了头指针的“本地拷贝”。正确的版本是传入一个头元素指针的指针:

bool insertInFront(IntElement **head, int data)

{

         IntElement *newItem = new IntElement;

         if(!newItem)

                   return false;

         newItem->data = data;

         newItem->next = head->next;

         *head = newItem;                  //正确啦

         return true;

}

当然,在C++中,头指针也可以通过引用来传递。

 

删除单个元素:

bool deleteElement(IntElement **head, IntElement *deleteMe)

{

         IntElement *elem = *head;

 

         if(deleteMe == *head)        //要删除的是头元素

         {

                   *head = elem->next;

                   delete deleteMe;

                   return true;

         }

 

         while(elem)

         {

                   if(elem->next == deleteMe)

                   {

                            elem->next = deleteMe->next;

                            delete deleMe;

                            return true;

                   }

                   elem = elem->next;

         }

 

         return false;

}

 

删除链表中的所有元素:

void deleteList(IntElement **head)

{

       IntElement *deleteMe = *head;

       while(deleteMe)

       {

              IntElement *next = deleteMe->next;

              delete deleteMe;

              deleteMe = next;

       }

       *head = NULL;

}

 

 

 

 

要设计一个算法删除链表中数据域值最大的节点,你可以按照以下步骤来进行: 1. 初始化两个指针,`current` 和 `maxNode`。`current` 指向链表节点,而 `maxNode` 初始设为空,用于存储最大值及其对应节点。 2. 遍历链表: - 对于每个节点 `node = current`: a. 如果 `maxNode` 为空或者当前节点的数据域值大于 `maxNode` 的数据域值,则将 `maxNode` 更新为当前节点,并记住它的前一个节点 (`prevMaxNode = current->prev`),因为后续需要回溯到这个位置。 b. 继续移动 `current` 指针,指向下一个节点 (`current = current->next`)。 3. 当遍历完成后,如果 `maxNode` 不是空的,说明找到了最大值的节点。此时需要删除它: - 如果 `maxNode` 就是节点(即 `prevMaxNode == NULL`),则直接更新节点为 `maxNode->next`。 - 否则,删除操作是在 `prevMaxNode` 后面进行,将 `prevMaxNode->next` 设置为 `maxNode->next`。 4. 返回新的链表部(可能是原来的第二个节点,取决于是否有最大值)。 ```cpp // 假设链表节点结构如下: struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* deleteLargestNode(ListNode* head) { if (head == nullptr || head->next == nullptr) { return head; // 单元素链表或只有一个节点 } ListNode *maxNode = head, *prevMaxNode = nullptr, *current = head->next; while (current != nullptr) { if (current->val > maxNode->val) { maxNode = current; prevMaxNode = current->prev; } current = current->next; } if (prevMaxNode == nullptr) { head = maxNode->next; } else { prevMaxNode->next = maxNode->next; } delete maxNode; // 删除找到的最大值节点 return head; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值