链表的简单介绍

来源:互联网 发布:讲诚信知敬畏发言稿 编辑:程序博客网 时间:2024/05/22 12:28

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。由于链表的结构很简单,它由指针把若干个结点连接成链状结构,所以链表应该是面试时被提及最频繁的数据结构。
链表是一种动态数据结构,在创建链表时,无须知道链表的长度。当插入一个结点时,我们只需要为新结点分配内存,然后调整指针的指向来确保新结点被连接到链表中。内存分配不是在创建链表时一次性完成的,而是在每添加一个结点分配一次内存。由于没有闲置的内存,链表的空间效率比数组高。如有下单链表的结点定义:

struct ListNode{    int m_nValue;    ListNode* m_pNext;};

往该链表的末尾添加结点的代码如下:

void AddToTail (ListNode** pHead, int value){    ListNode* pNew = new ListNode();    pNew->m_nValue = value;    pNew->m_pNext = NULL;    if (*pHead == NULL)    {        *pHead = pNew;    }    else    {        ListNode* pNode = *pHead;        while (pNode->m_pNext != NULL)        {            pNode = pNode->m_pNext;        }        pNode->m_pNext = pNew;    }}

第一个参数pHead是一个指向指针的指针,当在一个空链表中插入一个结点时,新插入的结点就是链表的头指针,由于此时会改动头指针,因此必须把pHead参数设置为指向指针的指针,否则出了这个函数pHead仍然是一个空指针。
由于链表中内存不是一次性分配的,因为无法保证链表的内存和数组一样是连续的。因此如果想在链表中查找第i个结点,只能使用遍历的方法进行查找,时间效率为O(n)。
删除链表中第一个含有某值的结点代码如下:

void PemoveNode(ListNode** pHead, int value){    if (pHead == NULL || *pHead == NULL)    {        return;    }    ListNode* pToBeDeleted = NULL;    if ((*pHead)->m_nValue == value)    {        pToBeDeleted = *pHead;        *pHead = (*pHead)->m_pNext;    }    else    {        ListNode* pNode = *pHead;        while (pNode->m_pNext != NULL && pNode->m_pNext->value != value)        {            pNode = pNode->m_pNext;        }        if (pNode->m_pNext != NULL && pNode->m_pNext->value == value)        {            pToBeDeleted = pNode->m_pNext;            pNode->m_pNext = pNode->m_pNext->m_pNext;        }    }    if (pToBeDeleted != NULL)    {        delete pToBeDeleted;        pToBeDeleted = NULL;    }}
0 0
原创粉丝点击