您的位置:首页 > 其它

单链表

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

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: