最近在做一道面试题,问道交换双链表的结点,真的就那么简单吗?
问题涉及的情况比较多,两个结点可能出现在头、尾以及中间,并且两个结点是否相邻都会影响操作的正确性,下面给出代码,包含了所有可能出现的情况。
struct Node { struct Node* next;//下一个结点指针 struct Node *pre;//上一个结点指针 int data;//数据 }; struct BilList { struct Node* first;//头节点 struct Node *last;//尾结点 int len;//链表长度 }; void swap(BilList *list,Node*node1,Node* node2) { //判空 assert(node1!=NULL||node2!=NULL); //两个不相等 if(node1==node2) return; //临时结点,存储每个结点的前后结点 Node*p,*q ,*s,*d; //每个结点都可能出现在首、中间、尾部等三种情况 //如果node1为头部 if(node1->pre==NULL) { //node2在尾部 if(node2->next==NULL) { //两结点相邻 if(node1->next==node2) { node1->next = NULL; node1->pre = node2; node2->pre = NULL; node2->next = node1; } //不相邻 else { p = node1->next; q = node2->pre; node1->next = NULL; node1->pre = q; node2->pre = NULL: node2->next = p; } list->first = node2; list->last = node1; } //node2在中间 else { //两结点相邻 if(node1->next==node2) { p= node2->next; p->pre = node1; node2->next = node1; node2->pre = NULL; node1->pre = node2; node1->next = p; } //不相邻 else { p= node2->next; q= node2->pre; s= node1->next; p->pre = node1; q->next = node1; node1->pre = q; node1->next = p; node2->next = s; s->pre = node2; node2->pre = NULL; } list->first = node2; } } //node1在尾部 else if(node1->next==NULL) { //node2在头部 if(node2 ->pre = NULL) { //两结点相邻 if(node2->next==node1) { node2->next = NULL; node2->pre = node1; node1->pre = NULL; node1->next = node2; } //不相邻 else { p = node2->next; q = node1->pre; node2->next = NULL; node2->pre = q; node1->pre = NULL: node1->next = p; } list->first = node1; list->last = node2; } //node2在中间 else { //两结点相邻 if(node2->next = node1) { p = node2->pre; node2->next = NULL; node2->pre = node1; node1->pre = p; node1->next = node2; } //不相邻 else { p = node1->pre; q = node2->pre; s = node2->next; q->next = node1; node1->pre = q; s->pre = node1; node1->next = s; node2->next = NULL; node2->pre = p; p->next = node2; } list->last = node2; } } //node1在中间 else { //node2在头部 if(node2->pre ==NULL) { //两结点相邻 if(node2->next==node1) { p= node1->next; p->pre = node2; node1->next = node2; node1->pre = NULL; node2->pre = node1; node2->next = p; } //不相邻 else { p= node1->next; q= node1->pre; s= node2->next; p->pre = node2; q->next = node2; node2->pre = q; node2->next = p; node1->next = s; s->pre = node1; node1->pre = NULL; } list->first = node1; } //node2在尾部 else if(node1->next = NULL) { //两结点相邻 if(node1->next = node2) { p = node1->pre; node1->next = NULL; node1->pre = node2; node2->pre = p; node2->next = node1; } //不相邻 else { p = node2->pre; q = node1->pre; s = node1->next; q->next = node2; node2->pre = q; s->pre = node2; node2->next = s; node1->next = NULL; node1->pre = p; p->next = node1; } list->last = node1; } //node2在中间 else { //相邻 if(node1->next==node2||node2->next ==node1) { if(node1->next ==node2) { p= node1->pre; q = node2->next; node1 ->next = q; q->pre = node1; node1->pre = node2; node2->next = node1; node2->pre = p; p->next = node2; } else { p= node2->pre; q = node1->next; node2 ->next = q; q->pre = node2; node2->pre = node1; node1->next = node2; node1->pre = p; p->next = node1; } } //不相邻 else { p = node1 - >next; q = node1->pre; s = node2->next; d = node2->pre; s->pre = node1; node1->next = s; d->next = node1; node1->pre = d; p->pre = node2; node2->next = p; q->next = node2; node2->pre = q; } } } }