题目:
两个双链表1,2分别以头节点数据域全为F开头,且两个链表中分别有多个元素可能相同。
设计函数intDeleteSameNodes(Node *pHeadA, Node *pHeadB);
typedef struct _Node
{
int data;
struct _Node *front, *next;
}Node;
思路1:
设双链表1的元素个数为m,双链表2的节点个数为n;
则
[cpp] view plaincopy
int DeleteSameNodes(Node *pHeadA,Node*pHeadB){
int deleteFlag = 0;
for(p1~双链表1中的m个节点)
{
for(p2~双链表2中的n个节点)
{
if(p1.data == p2.data)
{
delete p2.node;
deleteFlag = 1;
}
}//删除链表2中所有与该节点元素相同的节点
if(deleteFlag)//链2中有删除
{
for(p1~链表1中所有节点)
//删除所有p1中与该节点相同的节点
deleteFlag = 0;
}
}
return 0;
}
具体代码如下:
[cpp] view plaincopy
/************************************************************************/
/* @date:2011-09-19
@author:Jing
*/
/************************************************************************/
#include <iostream>
#include <ctime>
using namespace std;
#define TAG 0xFFFFFFFF
typedef struct _Node
{
int data;
struct _Node *front, *next;
}Node;
class DuLinkList
{
public:
DuLinkList()
{
head = new Node;
head->data = TAG;
head->front = head;
head->next = head;
}
~DuLinkList()
{
Node *p = head;
Node *q = head->next;
while(q->data != TAG)
{
p->next = q->next;
q->next->front = p;
delete q;
q = p->next;
}
delete p;
}
void InsertNode(int data);
friend intDeleteSameNodes(DuLinkList *pHeadA, DuLinkList *pHeadB);
void Print();
private:
Node *head;
};
void DuLinkList::InsertNode(int data)
{
Node *temp = new Node;
temp->data = data;
temp->next = head->next;
head->next->front = temp;
temp->front = head;
head->next = temp;
}
void DuLinkList::Print()
{
for (Node *p=head->next; p->data != TAG; p=p->next)
{
cout<<p->data<<endl;
}
cout<<"-------"<<endl;
}
int DeleteSameNodes(DuLinkList *pHeadA,DuLinkList *pHeadB)
{
Node *pA ;
Node *pB ;
bool deleteFlag = false;
for (pA=pHeadA->head->next;pA->data != TAG; NULL)
{
for (pB=pHeadB->head->next;pB->data != TAG; NULL )
{
Node *q = pB->next;//先把下一个节点保存下来
if (pA->data == pB->data)
{
//delete the node from PB
pB->next->front =pB->front;
pB->front->next =pB->next;
delete pB;
deleteFlag = true;
}
pB = q;
}
if ( deleteFlag == true)//有删除
{
//删除A中跟该节点相同的其他节点
//e.g: 1-2-2-1-1
for (Node *p = pA->next;p->data != TAG;)
{
Node *tempSave =p->next;//
if (p->data ==pA->data)
{
p->next->front =p->front;
p->front->next =p->next;
delete p;
}
p = tempSave;//后移一个节点
}
Node *tempNextNode = pA->next;
pA->next->front = pA->front;
pA->front->next = pA->next;
delete pA;//删除节点自身
pA = tempNextNode;//恢复PA身份
deleteFlag = false;//标志还原
}
else//没有删除
pA = pA->next;
}
return 0;
}
int main()
{
DuLinkList *pHeadA = new DuLinkList;
DuLinkList *pHeadB = new DuLinkList;
int data=0;
srand(time(0));
for (int i=0;i<5;i++)
{
data = rand() % 5;
//data = i+2;
pHeadA->InsertNode(data);
}
for (i=0;i<4;i++)
{
data = rand() % 6;
//data = 2;
pHeadB->InsertNode(data);
}
pHeadA->Print();
cout<<endl;
pHeadB->Print();
cout<<"after delete:"<<endl;
DeleteSameNodes(pHeadA,pHeadB);
pHeadA->Print();
cout<<endl;
pHeadB->Print();
delete pHeadA;
deletepHeadB;
return 0;
}