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

来源:互联网 发布:网络安全大数据分析 编辑:程序博客网 时间:2024/05/26 20:23

链表是一种动态数据结构

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

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

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

定义

单向链表的结点定义:

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;    }}
0 0
原创粉丝点击