PAT 1097. Deduplication on a Linked List (25) 剔除链表中的重复节点,set用法,尾插法

/*************************
题意:
剔除链表中data重复的节点,并放入一个新的链表
************************/
/***********************
解题思路:
考察链表的插入和删除。
用set去判断是否出现过。
被删除的节点用尾插法插入新链表。
*************************/
/***********************
笔记:

*********************/
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define M 100009
#define INF 0x7ffffff

struct Node{
	int addr;
	int data;
	int addnext;
};
Node node[M];


int main(){
	int i, j;
	int n, head, addr, data, addnext; 
	cin>>head>>n;
	for(i = 0;i < n;i++){
		scanf("%d%d%d",&addr, &data, &addnext);
		node[addr].addr = addr;
		node[addr].addnext = addnext;
		node[addr].data = data;
	}
	int lastp, q, p = head;
	int qhead;
	qhead = M+1;
	q = qhead;
	node[q].addnext = -1;
	set<int> s;
	while(p != -1){
		data = abs(node[p].data);
		if(s.find(abs(data)) == s.end()){
			s.insert(data);
			lastp = p;
			p = node[p].addnext;
		}
		else{
			node[lastp].addnext = node[p].addnext;
			node[q].addnext = node[p].addr;
			node[p].addnext = -1;
			q = p;  //尾插法 
			p = node[lastp].addnext;
		}
	
	}
	p = head;
	while(p != -1){
		printf("%05d %d ", p, node[p].data);
		if(node[p].addnext == -1)
			printf("-1\n");
		else printf("%05d\n",node[p].addnext);
		p = node[p].addnext;
	}
	p = node[qhead].addnext;
	while(p != -1){
		printf("%05d %d ", p, node[p].data, node[p].addnext);
		if(node[p].addnext == -1)
			printf("-1\n");
		else printf("%05d\n",node[p].addnext);
		p = node[p].addnext;
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值