删除两个双向链表中相同元素的所有节点

题目:

两个双链表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; 

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值