20190608链表思路

链表:由两部分组成,数据和地址(指向下一个结点),有头结点即可找到后续元素。
包含头结点,尾结点。
链表的操作:
1、创建
如果链表为空,创建一个结点,并把头給之,并且每创建一个结点,头赋予尾,重新开辟空间,依次循环,最后释放空间,并把头结点返回。
2、插入
声明两个指针p,q,以及插入值指针,当值小于插入值,并且下一个不为空时,循环q = p,p = p->next;退出循环后,当p为头指针时(头插),新插入结点下一个指向头,头赋予pnew,当p下一个为空时(尾插),p->next = pnew;当在中间插入时,前一个指针q指向pnew,pnew指向p。
3、删除
判断是否为空,当p的值不为要删除的值,并且p下一个不为空时,循环q = p,p = p->next;
接着有头删,只用头指向头的下一个,中间删,q的下一个指向p的下一个。释放空间
4、排序
两个指针,用选择排序。
5、合并两个链表
声明两个头指针,先遍历一个,走完接着第一个走即可。
6、判断链表是否有环
bool类型,声明一个慢指针,一个快指针,当两个指针非空时,一个走一步,一个走两步,二者相等时,返回真。
7、逆序
声明三个指针,p(指向头),pf,pn,开始时,pf指向head,pf下一个指向p,然后pf下一个赋空,当p下一个不为空时,p下一个指向pn,p下一个赋空,pf = p,p = pn,循环退出后,p的下一个指向pf。
8、查找中间结点
声明指针p为头,q为头,当p下一个以及下下一个不为空时,q走一步,p走两步,结束时返回q所指向的值。
9、查找倒数第几个
声明一个指针p指向头,while循环n,指针走一次,n–一次,相当于指针p提前走了n步,再声明另一个指针q指向头,在p当前基础上继续走,q开始走,当p为空时,q所指向的值就是倒数第n个值。

删除链表的节点(O(1)时间复杂度)
找出要删除节点(本身)的下一个,并且把下一个的值赋予本身,本身指向下一个的下一个。(此种情况是要删除的节点不在末尾)

要删除节点在开头(只有一个节点)
删除此节点,赋空,并且把头赋空

if (ptobedeleted->next != NULL)
	{
		Node *p = ptobedeleted->next;
		ptobedeleted->value = p->value;
		ptobedeleted->next = p->next;

		delete p;
		p = NULL;
	}

链表有多个节点,删除尾节点

else if (*plist = ptobedeleted)
	{
		delete ptobedeleted;
		ptobedeleted = NULL;
		plist = NULL;
	}

声明头节点,当不是要删除节点时,一直走,直至最后,并且头结点后一个指向空

else
	{
		Node *p = *plist;
		if (p->next != ptobedeleted)
		{
			p = p->next;
		}
		p->next = NULL;
		delete p;
		ptobedeleted = NULL;
	}
发布了39 篇原创文章 · 获赞 10 · 访问量 767

猜你喜欢

转载自blog.csdn.net/weixin_43393776/article/details/91349138
今日推荐