[面试] 算法(六)—— 链表

链表是一种动态数据结构

链表是一种动态数据结构,之所以称之为动态,是因为在创建链表时,无需知道链表的长度(这和数组形成鲜明的对比)。

当插入一个结点时,我们只需为新结点分配内存,然后调整指针的指向来确保新节点被链接到链表当中。内存分配不是在创建链表时一次性完成的,而是每添加一个结点分配一次内存。

由于没有闲置的内存,链表的空间效率比数组高。

定义

单向链表的结点定义:

struct ListNode
{
    int val;
    ListNode* next;
};

单向链表的尾插(需遍历)

void AddTail(ListNode** pHead, int val)
{
    // 由上文的链表的动态性可知,创建结点的动作在每次插入操作时执行
    ListNode* pNew = new ListNode;
    pNew->val = val;
    pNew->next = NULL;

    // 当前链表是否为空表
    if (*pHead == NULL)
        *pHead = pNew;
    else
    {
        // 遍历
        ListNode* pNode = *pHead;
        while (pNode->next)
            pNode = pNode->next;
        pNode->next = pNew;
    }
}

链表元素的删除

void RemoveNode(ListNode** pHead, int val)
{
    if (pHead == NULL || *pHead == NULL)
        return;

    ListNode* pToBeDel = NULL;          // 记录将被删除的结点

    if (*pHead -> val == val)
    {
        pToBeDel = *pHead;
        *pHead->next = *pHead->next;
    }
    else
    {
        ListNode* pNode = *pHead;
        while (pNode->next && pNode->next->val != val)
            pNode = pNode->next;
        if (pNode->next && pNode->next->val == val)
        {
            pToBeDel = pNode->next;
            pNode->next = pNode->next->next;
        }
    }
    if (pToBeDel)
    {
        delete pToBeDel;
        pToBeDel = NULL;
    }
}
    原文作者:Inside_Zhang
    原文地址: https://blog.csdn.net/lanchunhui/article/details/50989391
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞