链表的简单介绍
来源:互联网 发布:讲诚信知敬畏发言稿 编辑:程序博客网 时间: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
- 链表的简单介绍
- C的链表-简单介绍
- 外部表的简单介绍
- 堆组织表的简单介绍
- MySql临时表,索引的简单介绍
- sniffer的简单介绍
- JSValidation的简单介绍
- P2P的简单介绍
- ping的简单介绍
- gridview的简单介绍
- echo的简单介绍
- DOM的简单介绍
- Transact_SQL的简单介绍
- MSMQ的简单介绍
- Python简单的介绍
- OpenGL的简单介绍
- MSMQ的简单介绍
- ActiveX的简单介绍
- 《现代操作系统》读书笔记——第二章 进程与线程
- Android中的Java与JavaScript方法互调
- 构造函数中,成员变量一定要通过初始化列表来初始化的几种情况
- echarts框架创建各种图表
- Linux - 常用命令(长期更新)
- 链表的简单介绍
- HihoCoder 1249(2015 Asia Beijing Regional Contest)
- chrome插件开发之:关于Chrome插件的架构的理解
- shell脚本
- p3p协议是什么
- Android Framework框架之IBinder进程间通信
- NKOI 3805 距离
- 关于sql查询字符char类型数据的条件使用
- 以太坊帮助地址