• 7-4链表去重


    题目

    给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

    输入格式:

    输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤105,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。

    随后 N 行,每行按以下格式描述一个结点:

    地址 键值 下一个结点
    

    其中地址是该结点的地址,键值是绝对值不超过104的整数,下一个结点是下个结点的地址。

    输出格式:

    首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

    输入样例:

    1. 00100 5
    2. 99999 -7 87654
    3. 23854 -15 00000
    4. 87654 15 -1
    5. 00000 -15 99999
    6. 00100 21 23854

    输出样例:

    1. 00100 21 23854
    2. 23854 -15 99999
    3. 99999 -7 -1
    4. 00000 -15 87654
    5. 87654 15 -1

    代码长度限制

    16 KB

    时间限制

    400 ms

    内存限制

    64 MB

     思路

    用一个map mp;存放所有节点,其中键为节点地址,值为节点的值和下一个地址

    1. map<string, node> mp;
    2. struct node {
    3. int val;
    4. string nextadress;
    5. node(){};
    6. node(int c, string b)
    7. {
    8. val = c; nextadress = b;
    9. }
    10. };

    然后用类似深度优先搜索的思路将链表按照“地址”顺序遍历一遍,同时用map visited;标记所有出现过的绝对值有没有被访问过,用一个vector v;存放要被删除节点的地址。在遍历过程中如果节点值的绝对值x没有被访问过,则输出节点的地址和值,然后顺着地址找到第一个绝对值不等于x并且绝对值没有被访问过的节点,输出该节点地址,随后遍历该节点。一直遍历到最后一个节点为止。

    代码&&运行

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. struct node {
    7. int val;
    8. string nextadress;
    9. node(){};
    10. node(int c, string b)
    11. {
    12. val = c; nextadress = b;
    13. }
    14. };
    15. map mp;
    16. map<int, int> visited;
    17. vector v;//存放被删除的链表的地址
    18. int main()
    19. {
    20. ios::sync_with_stdio(false);
    21. string head;
    22. int n;
    23. cin >> head >> n;
    24. int cnt = 0;
    25. for (int i = 0; i < n; i++)
    26. {
    27. string a, b;
    28. int c;
    29. cin >> a >> c >> b;
    30. visited[abs(c)] = 0;
    31. mp[a].val = c;
    32. mp[a].nextadress = b;
    33. }
    34. string s = head;
    35. while (s != "-1")
    36. {
    37. string t = mp[s].nextadress;
    38. while( t!="-1"&&( abs(mp[t].val)==abs(mp[s].val)||visited[abs(mp[t].val)] ) )
    39. {
    40. v.push_back(t);
    41. t=mp[t].nextadress;
    42. }
    43. visited[abs(mp[s].val)]=1;
    44. cout<" "<" "<
    45. s=t;
    46. }
    47. /* 输出被删除部分 */
    48. for (int i = 0; i < v.size(); i++)
    49. {
    50. cout << v[i] << " " << mp[v[i]].val << " ";
    51. if (i != v.size() - 1) cout << v[i + 1] << endl;
    52. else cout << "-1\n";
    53. }
    54. }

    提醒

    该题的输入输出量较大,所以在cin和cout之前加上ios::sync_with_stdio(false);换行尽量用'\n'别用cout<

  • 相关阅读:
    python学习 - 设计模式 - 状态模式
    【Java】学生管理系统-登录、注册、CRUD(附完整代码)
    git常用命令总结
    Cygwin安装
    12、FPGA程序的固化和下载
    C++ 惯用法之 Copy-Swap 拷贝交换
    CoinW TOKEN2049 After Party落幕,分享如何在加密寒冬保持增长
    《见识》
    代码随想录算法训练营第23期day38|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    ORB-SLAM2 ---- Initializer::ReconstructF函数
  • 原文地址:https://blog.csdn.net/m0_73441691/article/details/134415429