单链表
2015-08-05 15:37
253 查看
前言
顺序表是用一组地址连续的存储单元来保存数据的,所以它具有随机存取的特点。即查找快速,但是做插入或删除动作是,需要移动大量元素,效率较低。链表是线性表的链式存储结构,它相比于顺序表,在插入和删除元素时,效率要高很多。
每个数据单元有两部分组成,一个是数据域,存储数据值;另一个是指针域,指向下一个数据单元。这样的数据单元叫做结点。
链表可分为单链表、双链表、循环链表。
基本算法
创建链表顺序表存储结构的创建就是数组的初始化,即声明一个类型和大小的数组并赋值。单链表是一种松散的存储结构,动态的,同时指针域,必须为指针域赋值。创建链表的过程就是动态生成链表的过程。从空表开始,依次建立各个元素结点,逐个插入链表。
头插法:采用插队的方式,始终让新建结点在第一的位置上。类似堆栈。
// 合并两个有序链表 ListNode * MergeSortedList(ListNode * pHead1, ListNode * pHead2) { //如果head1为空,返回head2 if(pHead1 == NULL) return pHead2; //如果head2为空,返回head1,这些处理防止后面访问链表中元素时,内存溢出 if(pHead2 == NULL) return pHead1; ListNode * pHeadMerged = NULL; //比较大小,确定合并链表的表头指向谁。 if(pHead1->m_nKey < pHead2->m_nKey) { pHeadMerged = pHead1; pHeadMerged->m_pNext = NULL; pHead1 = pHead1->m_pNext; } else { pHeadMerged = pHead2; pHeadMerged->m_pNext = NULL; pHead2 = pHead2->m_pNext; } ListNode * pTemp = pHeadMerged; //开始向合并链表中添加节点 while(pHead1 != NULL && pHead2 != NULL) { if(pHead1->m_nKey < pHead2->m_nKey) { //head1中元素小,通过尾插法,将小的结点先放在链表尾。 //将head1插入链表中 pTemp->m_pNext = pHead1; //head1下移,继续循环 pHead1 = pHead1->m_pNext; //让temp始终指向表尾,也是就next pTemp = pTemp->m_pNext; //表尾设置为null. pTemp->m_pNext = NULL; } else { pTemp->m_pNext = pHead2; pHead2 = pHead2->m_pNext; pTemp = pTemp->m_pNext; pTemp->m_pNext = NULL; } } if(pHead1 != NULL) pTemp->m_pNext = pHead1; else if(pHead2 != NULL) pTemp->m_pNext = pHead2; return pHeadMerged; }
View Code
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- C++易混淆概念
- 循环日程表问题
- python问题:IndentationError:expected an indented block错误解决
- iOS开发之倒计时
- 【C++】拷贝构造函数和赋值函数
- 伸展树复习 (bzoj 1251 序列终结者)
- MySQL 主主(双主)复制
- 最长上升子序列O(NlogN)算法
- 如何在Oracle中复制表结构和表数据
- NOI2010 能量采集
- gitlab升级方法
- Android获取Manifest中<meta-data>元素的值
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- iOS培训-UI用户界面基础-界面推送
- Java实现基于百度地图的坐标拾取功能
- Socket
- 从应用程序的角度看Binder (十)
- Permission is only granted to system apps异常解决
- 数据挖掘方法案例介绍
- linux命令-------------------------lsof