您的位置:首页 > 理论基础 > 数据结构算法

基本数据结构:链表(list)(2)

2012-07-31 17:46 435 查看
接上篇

第九步,实现insert()和insertHead()函数,在p节点后插入值为x的节点。如图5。





代码如下:

template<class T>

void  myslist<T>::insert(T x,slistNode<T>* p)

{

if(p==NULL) return;

node=new slistNode<T>();//申请一个新的空间

node->data=x;//如图5

node->next=p->next;

p->next=node;

if(node->next==NULL)//如果node为尾节点

lastnode=node;

}

template<class T>

void  myslist<T>::insertHead(T x)

{

node=new slistNode<T>();

node->data=x;

node->next=headnode;

headnode=node;

}


最终,我们完成一个简单的单向链表。此单向链表代码还有很多待完善的地方,以后会修改代码并不定时更新。
二、 双向链表
双向链表的指针域有两个指针,每个数据结点分别指向直接后继和直接前驱。单向链表只能从表头开始向后遍历,而双向链表不但可以从前向后遍历,也可以从后向前遍历。除了双向遍历的优点,双向链表的删除的时间复杂度会降为O(1),因为直接通过目的指针就可以找到前驱节点,单向链表得从表头开始遍历寻找前驱节点。缺点是每个节点多了一个指针的空间开销。如图6就是一个双向链表。





三、 循环链表
循环链表就是让链表的最后一个节点指向第一个节点,这样就形成了一个圆环,可以循环遍历。单向循环链表可以单向循环遍历,双向循环链表的头节点的指针也要指向最后一个节点,这样的可以双向循环遍历。如图7就是一个双向循环链表。





四、 链表相关问题
1、如何判断一个单链表有环
2、如何判断一个环的入口点在哪里
3、如何知道环的长度
4、如何知道两个单链表(无环)是否相交
5、如果两个单链表(无环)相交,如何知道它们相交的第一个节点是什么
6、如何知道两个单链表(有环)是否相交
7、如果两个单链表(有环)相交,如何知道它们相交的第一个节点是什么
本文出自 “C小加&SunRise” 博客,请务必保留此出处http://lwxcy.blog.51cto.com/2467073/949204
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: