7-4链表去重

题目

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

输入格式:

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

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

地址 键值 下一个结点

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

输出格式:

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

输入样例:

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

输出样例:

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 思路

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

map mp;
struct node {
    int val;
    string nextadress;
    node(){};
    node(int c, string b)
    {
        val = c; nextadress = b;
    }
};

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

代码&&运行

#include
#include
#include
#include
using namespace std;
struct node {
    int val;
    string nextadress;
    node(){};
    node(int c, string b)
    {
        val = c; nextadress = b;
    }
};
map mp;
map visited;
vector v;//存放被删除的链表的地址
int main()
{
    ios::sync_with_stdio(false);
    string head;
    int n;
    cin >> head >> n;
    int cnt = 0;

    for (int i = 0; i < n; i++)
    {
        string a, b;
        int c;
        cin >> a >> c >> b;
        visited[abs(c)] = 0;
        mp[a].val = c;
        mp[a].nextadress = b;
    }
    string s = head;
    while (s != "-1")
    {
        string t = mp[s].nextadress;
        while( t!="-1"&&( abs(mp[t].val)==abs(mp[s].val)||visited[abs(mp[t].val)] ) )
        {
            v.push_back(t);
            t=mp[t].nextadress;
        }
        visited[abs(mp[s].val)]=1;
        cout<

7-4链表去重_第1张图片

提醒

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

你可能感兴趣的:(数据结构学习记录,链表,数据结构)