如何实现单链表任意两个元素交换(不包括表头)

来源:互联网 发布:银行卡js验证规则 编辑:程序博客网 时间:2024/05/22 09:07






// 凭第一感觉写的版本,算法和思路有好的想法再优化


/* 交换链表任意两个元素 */void SwapItem(LinkedList *head, int posA, int posB)//从非头结点开始交换操作{//保证至少存在两个节点assert(head && head->next && head->next->next);assert(posA>=1 && posB>=1);if (posA == posB){printf("\nerror: %d,交换位置相同,不做任何操作!\n", __LINE__);getchar();//return;exit(1);}//保证交换位置合理性,参数2,3写反位置也没关系int first,second;if (posA<posB) { first = posA, second = posB;}else {first = posB;second = posA;}if ((second - first) == 1) //A与B是相邻的两个节点{LinkedList *prev, *nodeA, *nodeB, *post;int i = 1;prev = head;nodeA = prev->next;nodeB = nodeA->next;while (i<first && nodeB) //定位到节点A、B的位置{prev = prev->next;nodeA = nodeB;nodeB = nodeB->next;i++;}if (nodeB == NULL) //B节点超出链表范围{printf("\nerror: %d\n", __LINE__);getchar();//return;exit(1);}else {prev->next = nodeB;nodeA->next = nodeB->next;nodeB->next = nodeA;}}else //A与B是不相邻的点{LinkedList *prevA, *nodeA, *prevB, *nodeB;//prevA是节点nodeA节点的前驱节点,prevB是节点nodeB的前驱节点prevA = head;nodeA = prevA->next;int iA=1, jB=1;while (iA<first && nodeA)//定位到nodeA节点位置{prevA = nodeA;nodeA = nodeA->next;iA++;}if (nodeA == NULL) //nodeA节点超出链表范围{printf("\nerror: %d\n", __LINE__);getchar();//return;exit(1);}prevB = head;nodeB = prevB->next;while (jB<second && nodeB)//定位到nodeB节点位置{prevB = nodeB;nodeB = nodeB->next;jB++;}if (nodeB == NULL) //nodeB节点超出链表范围{printf("\nerror: %d\n", __LINE__);getchar();//return;exit(1);}//各项均满足,可以交换LinkedList *tempB;tempB = nodeB->next;prevA->next = nodeB;prevB->next = nodeA;nodeB->next = nodeA->next;nodeA->next = tempB;}}





0 0
原创粉丝点击