链表是一种动态数据结构
链表是一种动态数据结构,之所以称之为动态,是因为在创建链表时,无需知道链表的长度(这和数组形成鲜明的对比)。
当插入一个结点时,我们只需为新结点分配内存,然后调整指针的指向来确保新节点被链接到链表当中。内存分配不是在创建链表时一次性完成的,而是每添加一个结点分配一次内存。
由于没有闲置的内存,链表的空间效率比数组高。
定义
单向链表的结点定义:
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;
}
}