初夏小谈:交换链表结点(链表进阶操作)
链子问题持续更新之交换两个链表中的结点(兼职交换一条链表中两个结点的交换)
交换两个链表中的结点,就是要将要交换的两个结点改变,而其它结点不变。
四指针法:
交换两个结点,就要找到它的前一个结点,将前一个结点的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;//把第二条原来的交换的结点后面的结点接回来
}
}
这道题的难点在于对链表第一个结点的交换。(作者使用头指针方式)所以对链表第一个结点进行考虑。如果你想交换一个链表中的两个结点,只需将参数中第二个指针改为第一个指针即可。
珍&源码