/*
* 算法功能:建立单链表,交换单链表中的两个元素。
* 算法中的单链表是带头结点的。
* 函数说明:nop
* @author:xiaoq-ohmygirl
* @time :2012-06-20
**/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXNODE 10
typedef struct node{
int data;
node* next;
}*linkNode,*linkList;
//建立带有头结点的单链表。
int createLinkList(linkList & L,int n){
L = (linkList)malloc(sizeof(linkNode));
if(!L){
return 0;
}
L->next = NULL;
linkList p;
for(int i = n;i > 0;i--){
p = (linkList)malloc(sizeof(linkNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
return 1;
}
void visit(linkNode node){
printf("%d->",node->data);
}
void getNewLine(){
printf("\n");
}
//带头结点的单链表
void traverseLink(linkList L){
linkNode cur = L->next;
getNewLine();
while(cur != NULL){
visit(cur);
cur = cur->next;
}
getNewLine();
}
//寻找链表中的第k个节点。
linkNode findNode(const linkList L,int k){
linkNode node = L;
for(int i = 1;i<=k;i++){
node = node->next;
}
return node;
}
linkNode findPre(const linkList head,const linkNode node){
linkNode tmp = head;
while(tmp->next != node){
tmp = tmp->next;
}
return tmp;
}
/*
* 根据两个节点的前驱,交换两个节点
* 需要考虑的情况有:
* 1.如果节点1和节点2相同,不需要交换
* 2.如果其中一个节点为头节点,原则上不交换
* 3.如果两个节点相邻,需要做一些特殊处理。
* 4.其他情况下只需要找到节点的前驱,然后做相应的指针的调整。
**/
void doExchange(linkNode head,linkNode node1,linkNode node2){
linkNode prenode1 = NULL; //待交换节点node1的前一个节点
linkNode postnode1 = NULL; //待交换节点node1的后一个节点
linkNode prenode2 = NULL; //待交换节点node2的前一个节点
linkNode postnode2 = NULL; //待交换节点node2的后一个节点
//头节点不交换
if (node1 == head || node2 == head){
return;
}
//相同不需交换
if (node1 == node2){
return;
}
prenode1 = findPre(head,node1);
prenode2 = findPre(head,node2);
postnode1 = node1->next;
postnode2 = node2->next;
//节点相邻情况处理
if (postnode1 == node2){
prenode1->next = node2;
node2->next = node1;
node1->next = postnode2;
return;
}
if (postnode2 == node1){
prenode2->next = node1;
node1->next = node2;
node2->next = postnode1;
return;
}
//其他情况下,直接交换节点
prenode1->next = node2;
node2->next = postnode1;
prenode2->next = node1;
node1->next = postnode2;
}
main(){
linkList L;
linkNode node1,node2,node3;
createLinkList(L,MAXNODE);
traverseLink(L);
node1 = findNode(L,3);
node2 = findNode(L,4);
node3 = findNode(L,5);
doExchange(L,node1,node2);
traverseLink(L);
doExchange(L,node2,node3);
traverseLink(L);
system("pause");
return 0;
}
【学习点滴-数据结构-单链表】交换单链表中任意两个元素
最新推荐文章于 2023-07-28 12:04:04 发布