• PAT甲级题解-1097. Deduplication on a Linked List (25)-链表的删除操作


      给定一个链表,你需要删除那些绝对值相同的节点,对于每个绝对值K,仅保留第一个出现的节点。删除的节点会保留在另一条链表上。简单来说就是去重,去掉绝对值相同的那些。先输出删除后的链表,再输出删除了的链表。

      建立结构体节点,包括起始地址addr,下一个地址to,值value。链表数组索引为地址,接下来就是模拟链表的操作了,并且建立一个flag数组标记对应值K是否出现,若出现则flag[k]=addr,未出现则为-1,注意这里不能为0因为地址值存在为0的情况。最后的输出地址前面要补0,如果是链尾的话,-1则不需要补0。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string.h>
    #include <cmath>
    using namespace std;
    
    const int maxn=100000+5;
    struct Node{
        int addr;
        int value;
        int to;
    }node[maxn];
    int flag[maxn];
    int linkedlist[maxn];  //去重后的链表
    int removelist[maxn];  //删除节点组成的链表
    
    int main()
    {
        int head,n;
        int a,b,c;
        for(int i=0;i<maxn;i++)
            flag[i]=-1;
        ///memset(flag,0,sizeof(flag)); 地址中存在为0的情况,所以不能用0表示还没出现啊啊
        scanf("%d %d",&head,&n);
        for(int i=0;i<n;i++){
            scanf("%d %d %d",&a,&b,&c);
            node[a].addr=a;
            node[a].value=b;
            node[a].to=c;
        }
        int tmp;
        int cnt1=0,cnt2=0;
        int lastaddr=-1; //存储目前linkedlist链表的最后一个节点
        do{
            tmp=abs(node[head].value);
            if(flag[tmp]==-1){
                linkedlist[cnt1++]=node[head].addr;
                flag[tmp]=node[head].addr;
                lastaddr=head;
            }
            else{
                removelist[cnt2++]=node[head].addr;
                node[lastaddr].to=node[head].to;
            }
            head=node[head].to;
        }while(head!=-1);
    
        int id;
        //更新removelist中节点的to
        for(int i=0;i<cnt2-1;i++){
            id=removelist[i];
            node[id].to=node[removelist[i+1]].addr;
        }
        node[removelist[cnt2-1]].to=-1;
        node[linkedlist[cnt1-1]].to=-1;
        for(int i=0;i<cnt1-1;i++){
            id=linkedlist[i];
            printf("%05d %d %05d
    ",node[id].addr,node[id].value,node[id].to);
        }
        //注意最后因为地址是-1,所以得另外输出
        if(cnt1>=1){
            id=linkedlist[cnt1-1];
            printf("%05d %d %d
    ",node[id].addr,node[id].value,node[id].to);
        }
        for(int i=0;i<cnt2-1;i++){
            id=removelist[i];
            printf("%05d %d %05d
    ",node[id].addr,node[id].value,node[id].to);
        }
        if(cnt2>=1){
            id=removelist[cnt2-1];
            printf("%05d %d %d
    ",node[id].addr,node[id].value,node[id].to);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    echarts中图表过于靠左或靠右的情况解决办法。
    C#语法糖大汇总【转发】
    近期对于windows服务的理解
    解决echarts中X轴文字过长的问题。【转】
    两个页面之间通过后台处理,调用父窗体方法。
    docker
    docker php
    webpack
    jwt 解密
    阿里云服务器 ECS Linux 主机删除文件后磁盘空间显示不变(转载https://www.zhanqunfuwuqi.com/archives/5293)
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6102450.html
Copyright © 2020-2023  润新知