初夏小谈:交换链表结点(链表进阶操作)

链子问题持续更新之交换两个链表中的结点(兼职交换一条链表中两个结点的交换)

交换两个链表中的结点,就是要将要交换的两个结点改变,而其它结点不变。

四指针法:

交换两个结点,就要找到它的前一个结点,将前一个结点的next改为另一个要交换的结点的地址即可,但是这样交换,那么交换得结点及它后的所有结点会全部接到另一个结点,所以再标记两个结点(即两个结点后面的结点),这样就可以方便的进行交换的后续操作。

OK代码如下:

//2.交换两个链表中的结点
//2.1引入四个指针法
void SwapLinkList(LinkList* first1, DataType data1, LinkList* first2, DataType data2)
{
	LinkListNode* ptr1;
	LinkListNode* ptr2;
	LinkListNode* ptr1s;//用来接收该数据结点的下一个结点位置
	LinkListNode* ptr2s;
	LinkListNode* ptr2S;
	if (first1->head->data != data1 && first2->head->data != data2)
	{
		ptr1 = FindLinkList2(first1, data1);//接收数据结点的上一个结点
		ptr2 = FindLinkList2(first2, data2);
		if (ptr1 == NULL || ptr2 == NULL)//如果至少有一条链表不存在则交换无意义
		{
			return;
		}
		else
		{
			ptr1s = ptr1->next;//保存交换的结点位置
			ptr2s = ptr2->next;
			ptr2S = ptr2->next->next;//由于会将第二条链表后面丢失,所以标记
			ptr1->next = ptr2->next;//先把交换的结点及他后面的结点接到另一个上面
			ptr2->next = ptr1s;
			ptr1->next->next = ptr1s->next;//再把交换结点的后面的结点再接回去
			ptr2->next->next = ptr2S;
		}
	}
	else if (first1->head->data == data1 && first2->head->data != data2)
	{
		ptr1 = first1->head;
		LinkListNode* ptr1Next = ptr1->next;
		ptr2 = FindLinkList2(first2, data2);
		ptr1s = ptr1;//保存交换的结点位置
		ptr2s = ptr2->next;
		ptr2S = ptr2->next->next;//由于会将第二条链表后面丢失,所以标记
		ptr1 = ptr2->next;//先把交换的结点及他后面的结点接到另一个上面
		ptr2->next = ptr1s;
		ptr1->next = ptr1Next;//再把交换结点的后面的结点再接回去
		ptr2->next->next = ptr2S;
		first1->head = ptr1;
	}
	else if (first1->head->data != data1 && first2->head->data == data2)
	{
		SwapLinkList(first2, data2, first1, data1);
	}
	else
	{
		ptr1 = first1->head->next;//保存交换的结点的后面结点位置
		ptr2 = first2->head->next;
		ptr1s = first1->head;//标记第一条链表的头指针
		first1->head = first2->head;//第一条链表头指针指向第二条链表
		first1->head->next = ptr1;//把第一条原来的交换的结点后面的结点接回来
		first2->head = ptr1s;//第二条链表头指针指向(原来)第一条链表
		first2->head->next = ptr2;//把第二条原来的交换的结点后面的结点接回来
	}
}

这道题的难点在于对链表第一个结点的交换。(作者使用头指针方式)所以对链表第一个结点进行考虑。如果你想交换一个链表中的两个结点,只需将参数中第二个指针改为第一个指针即可。

                                                                                                                                                                               珍&源码

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务