算法-链表01-移除链表元素

移除链表元素

力扣题目链接

题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

解题思路

这道题就是考察大家对于链表的理解,只要学习了链表的结构和基本操作就可以尝试去解答这道题目了。
我们知道如果链表需要移除一个元素,就是将节点x的前一个节点的next指向节点x的后一个节点,那么在这个链表中x自然不会存在。但是在内存中节点x仍然存在,这片内存就是泄露了(开个坑,年后写一篇关于内存泄漏的文章),所以需要我们去手动删除(C++需要delete)(C#存在着内存管理机制,可以自动释放也可以手动调用)
但是分析完题目我们会发现,如果头节点的值等于目标值,那么我们没有前置节点,所以我们需要给一个虚拟的头结点用于指向目标链表,然后进行链表的遍历和删除操作。

题解

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* vhead = new ListNode(0);

        vhead->next = head;
        ListNode* curp = vhead;
        while(curp->next != nullptr){
            if(curp->next->val == val){
                ListNode* temp = curp->next;
                curp->next = temp->next;
                delete temp;
            }
            else{
                curp = curp->next;
            }
        }

        head = vhead->next;
        delete vhead;
        return head;
    }
};

总结

本体的难点就是如何去处理头结点,这里展示的是一种取巧的方法,大家也可以对头结点进行单独的处理也可以达到一样的效果。

### 链表的概念 链表是一种线性数据结构,其中的元素不是连续存储在内存中的。相反,这些元素通过指针链接在一起形成一个序列。每个节点包含两部分:一部分用于保存实际的数据;另一部分是一个指向下一个节点的引用(即指针)。这种特性使得向列表中插入新项变得非常容易。 对于单向链表而言,每个结点只含有向前遍历到下一结点的信息[^1]。而双向链表则允许更灵活的操作因为它不仅有前驱还有后继两个方向上的连接关系[^3]。 ### 存储方式 链表采用的是链式存储的方式,这意味着它并不像数组那样依赖于固定的地址空间来容纳所有的元素。因此当涉及到频繁增删操作时效率更高因为不需要移动其他位置上已有的记录就可以完成调整工作[^2]。 ### 应用场景 由于其独特的性质,链表被广泛应用于各种编程任务当中: - **实现 LRU 缓存淘汰算法**:最近最少使用的页面会被标记为可替换目标并最终移除- 文件系统内的文件块分配机制可以借助链表来进行管理; - 数据流处理过程中充当临时储存容器的角色以应对突发性的大量输入/输出请求等情形下的缓冲需求。 ### Python 中简单链表的实现 以下是使用Python编写的简易版单项链表类定义及其基本功能展示: ```python class Node: def __init__(self, data=None): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if not self.head: self.head = new_node return last = self.head while last.next: last = last.next last.next = new_node def display(self): current = self.head elements = [] while current is not None: elements.append(current.data) current = current.next print(elements) # 创建实例对象并测试方法 llist = LinkedList() for i in range(5): llist.append(i * 2) llist.display() ``` 这段代码展示了如何创建一个新的节点以及将其添加至现有链条末端的方法`append()` 和打印整个链条内所有数值组成的列表 `display()` 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值