【题目】
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。
例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
结构体:
struct ListNode{ int val; ListNode *next; };
请完成函数void difference(ListNode** LA , ListNode* LB)
------迅雷校招
【代码一】
#include <iostream> #include <string.h> #include <algorithm> using namespace std; struct ListNode{ int val; ListNode *next; }; // 输出集合 void Display(ListNode* root){ ListNode* p = root; while(p){ cout<<p->val<<endl; p = p->next; } } // 求两个集合的差集保存在LA中 void Difference(ListNode** LA,ListNode* LB){ // 容错处理 if(*LA == NULL || LB == NULL){ return; } ListNode *pa,*pb,*pre,*node; pa = *LA; pre = NULL; bool isDelete; // 遍历LA while(pa){ pb = LB; isDelete = false; while(pb){ // 删除pa if(pa->val == pb->val){ isDelete = true; // 头元素 if(pre == NULL){ *LA = pa->next; pa = *LA; }//if else{ node = pa; pre->next = pa->next; delete node; pa = pre->next; } break; }//if pb = pb->next; }//while // 如果有删除pa跳到pa->next if(!isDelete){ pre = pa; pa = pa->next; } }//while } int main(){ int arrayA[] = {5,10,20,15,25,30}; int arrayB[] = {5,15,35,25}; ListNode* node; // 集合A ListNode *LA = (ListNode*)malloc(sizeof(ListNode)); LA->val = 5; LA->next = NULL; ListNode *p = LA; for(int i = 1;i < 6;i++){ node = (ListNode*)malloc(sizeof(ListNode)); node->val = arrayA[i]; node->next = NULL; p->next = node; p = node; } // 集合B ListNode *LB = (ListNode*)malloc(sizeof(ListNode)); LB->val = 5; LB->next = NULL; p = LB; for(int i = 1;i < 4;i++){ node = (ListNode*)malloc(sizeof(ListNode)); node->val = arrayB[i]; node->next = NULL; p->next = node; p = node; } // 求AB差集 Difference(&LA,LB); // 输出AB差集 Display(LA); }
【代码二】
// 求两个集合的差集保存在LA中 void Difference(ListNode** LA,ListNode* LB){ // 容错处理 if(*LA == NULL || LB == NULL){ return; } ListNode *pa,*pb,*pre,*node; pa = *LA; pre = NULL; // 遍历LA while(pa){ pb = LB; // 遍历直到末尾 while(pb != NULL && pa->val != pb->val){ pb = pb->next; }//while // pb中没有与之相同元素 if(pb == NULL){ pre = pa; pa = pa->next; } // 有相同元素 else{ // 头元素 if(pre == NULL){ *LA = pa->next; pa = pa->next; } else{ node = pa; pre->next = pa->next; pa = pa->next; delete node; }//if }//if }//while }