[笔试题 7][c/c++]删除两个双向链表中相同元素的所有节点
2011-09-18 23:41
513 查看
题目:
两个双链表1,2分别以头节点数据域全为F开头,且两个链表中分别有多个元素可能相同。
设计函数int DeleteSameNodes(Node *pHeadA, Node *pHeadB);
typedef struct _Node
{
int data;
struct _Node *front, *next;
}Node;
思路1:
设双链表1的元素个数为m,双链表2的节点个数为n;
则
具体代码如下:
思路1的另一种写法。by SGZ
1)将两个链表连接成一个链表。
2)删除一个链表中的重复元素,注意界线和标记。
两个双链表1,2分别以头节点数据域全为F开头,且两个链表中分别有多个元素可能相同。
设计函数int DeleteSameNodes(Node *pHeadA, Node *pHeadB);
typedef struct _Node
{
int data;
struct _Node *front, *next;
}Node;
思路1:
设双链表1的元素个数为m,双链表2的节点个数为n;
则
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; }
具体代码如下:
/************************************************************************/ /* @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 int DeleteSameNodes(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; delete pHeadB; return 0; }
思路1的另一种写法。by SGZ
1)将两个链表连接成一个链表。
2)删除一个链表中的重复元素,注意界线和标记。
相关文章推荐
- 删除两个双向链表中相同元素的所有节点
- 数据结构——12 删除两个双向链表中相同的节点
- 删除两个双向循环链表中具有相同值的节点
- 删除两个双向循环链表的相同节点
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 删除两个双向链表中重复元素
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 单链表的创建(头插尾插),表长,输出,插入,删除,查找,逆置,分解长两个链表(奇数偶数链表),查找倒数第k个元素,产出相同元素
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。
- 笔试算法题(28):删除乱序链表中的重复项 & 找出已经排好序的两个数组中的相同项
- 中兴通讯2012笔试题删除双向循环链表中相同的数值
- 删除两个双向循环链表的相同节点
- 网新恒天笔试题,有两个整形数组A和B,请编程去除这两个数组间的交集。若有相同元素,则在相同元素较多的数组中保留它。例如,数组A有三个1,数组B有两个1,程序将删除数组B中的两个1.
- 删除两个双向链表中值相同的结点--带空白头结点
- C/C++ | 28-20 写出程序删除链表中的所有节点
- 删除两个双向循环链表的相同节点
- 雅虎面试题─将两个双向循环链表中data值相同的结点删除
- 删除两个双向链表值相同的结点