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

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

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

四指针法:

交换两个结点,就要找到它的前一个结点,将前一个结点的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;//把第二条原来的交换的结点后面的结点接回来
	}
}

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

                                                                                                                                                                               珍&源码

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值