雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
来源:互联网 发布:你初到大城市知乎 编辑:程序博客网 时间:2024/05/22 05:33
有双向循环链表结点定义为:
struct node
{
int data;
struct node *front,*next;
};
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。
用两个向量A_vec、B_vec分别存储链表A、B的元素值,将A_vec、B_vec排序,用类似归并排序的方法把A_vec、B_vec中值相同的元素放到向量common_vec中。分别遍历链表A、B,用二分查找法查看每个节点元素是否在common_vec中。
// 链表结点template <typename T>class dc_list_node{public: dc_list_node(const T &item = T(), dc_list_node<T> *p_front = NULL, dc_list_node<T> *p_next = NULL): m_item(item), mp_front(p_front), mp_next(p_next) {} T m_item; dc_list_node<T> *mp_front; dc_list_node<T> *mp_next;private: dc_list_node(const dc_list_node<T> &); dc_list_node<T> &operator=(const dc_list_node<T> &);};
void dc_list_erase_node_with_equal_value(dc_list_node<int> *&p_headA, dc_list_node<int> *&p_headB){ if (p_headA == NULL || p_headB == NULL) return; // A_vec存储链表A的元素值,B_vec存储链表B的元素值 std::vector<int> A_vec, B_vec, common_vec; dc_list_node<int> *p_node; A_vec.push_back(p_headA->m_item); p_node = p_headA->mp_next; while (p_node != p_headA) { A_vec.push_back(p_node->m_item); p_node = p_node->mp_next; } B_vec.push_back(p_headB->m_item); p_node = p_headB->mp_next; while (p_node != p_headB) { B_vec.push_back(p_node->m_item); p_node = p_node->mp_next; } // 将A_vec和B_vec排序 std::sort(A_vec.begin(), A_vec.end()); std::sort(B_vec.begin(), B_vec.end()); // 合并A_vec和B_vec相同的元素值到common_vec std::size_t i = 0, j = 0; while (i < A_vec.size() && j < B_vec.size()) { if (A_vec[i] < B_vec[j]) ++i; else if (A_vec[i] > B_vec[j]) ++j; else { common_vec.push_back(A_vec[i]); ++i; ++j; } } // 分别遍历链表A和B,删除在元素值common_vec中的结点 p_node = p_headA; for (i = 0; i < A_vec.size(); ++i) { if (std::binary_search(common_vec.begin(), common_vec.end(), p_node->m_item)) // 当前结点是值相同的结点 { if (p_node == p_headA && p_node->mp_next == p_headA) // 链表中只有头结点一个结点 { delete p_headA; p_headA = NULL; break; } else if (p_node == p_headA) // 当前结点是头结点 { p_headA = p_node->mp_next; p_headA->mp_front = p_node->mp_front; p_node->mp_front->mp_next = p_headA; p_node = p_headA; } else { dc_list_node<int> *p_next = p_node->mp_next, *p_front = p_node->mp_front; p_next->mp_front = p_front; p_front->mp_next = p_next; delete p_node; p_node = p_next; } } else p_node = p_node->mp_next; } p_node = p_headB; for (i = 0; i < B_vec.size(); ++i) { if (std::binary_search(common_vec.begin(), common_vec.end(), p_node->m_item)) // 当前结点是值相同的结点 { if (p_node == p_headB && p_node->mp_next == p_headB) // 链表中只有头结点一个结点 { delete p_headB; p_headB = NULL; break; } else if (p_node == p_headB) // 当前结点是头结点 { p_headB = p_node->mp_next; p_headB->mp_front = p_node->mp_front; p_node->mp_front->mp_next = p_headB; p_node = p_headB; } else { dc_list_node<int> *p_next = p_node->mp_next, *p_front = p_node->mp_front; p_next->mp_front = p_front; p_front->mp_next = p_next; delete p_node; p_node = p_next; } } else p_node = p_node->mp_next; }}
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 雅虎面试题─将两个双向循环链表中data值相同的结点删除
- 删除两个双向链表中值相同的结点--无空白头结点
- 删除两个双向链表中值相同的结点--带空白头结点
- 经典面试题--两个双向链表删除相同值
- 有两个链表a和b,设结点中包含学号和姓名,从a链表中删除和b链表中相同学号的结点
- 有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。
- 删除两个双向循环链表的相同节点
- 删除两个双向循环链表的相同节点
- 删除两个双向循环链表的相同节点
- 删除两个双向循环链表的相同节点
- 删除两个双向链表值相同的结点
- 双向+头结点+循环的链表
- 定制我的Nexus系统之内核编译
- 解决不安装VC运行库(VC2005,VC2008),程序运行出错的方法。
- Define and output a file
- MRP的逻辑流程图
- 字节缓冲流和字符缓冲流的对比
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- MFC 单文档 动态控件添加
- Linux细节 - Linux常用信息显示命令
- ORA-02291: 违反完整约束条件 - 未找到父项关键字
- Linux细节 - Linux常用网络命令
- 网站发布到 64 机上的时候出现的一些问题
- C++的一些小总结 类 静态成员变量/函数 this指针
- 布局管理器面面观
- Linux细节 - Linux常用操作命令