PAT 1097 Deduplication on a Linked List

个人学习记录,代码难免不尽人意

Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplicated absolute values of the keys. That is, for each value K, only the first node of which the value or absolute value of its key equals K will be kept. At the mean time, all the removed nodes must be kept in a separate list. For example, given L being 21→-15→-15→-7→15, you must output 21→-15→-7, and the removed list -15→15.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, and a positive N (≤10 5 ) which is the total number of nodes. The address of a node is a 5-digit nonnegative integer, and NULL is represented by −1.

Then N lines follow, each describes a node in the format:

Address Key Next

where Address is the position of the node, Key is an integer of which absolute value is no more than 10 4, and Next is the position of the next node.

Output Specification:

For each case, output the resulting linked list first, then the removed list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 5

99999 -7 87654

23854 -15 00000

87654 15 -1

00000 -15 99999

00100 21 23854

Sample Output:

00100 21 23854

23854 -15 99999

99999 -7 -1

00000 -15 87654

87654 15 -1

cpp 复制代码
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<set>
using namespace std;
struct node{
	int data;
	int address;
	int next; 
}Node[100010];

int main(){
  int first,n,k;
  scanf("%d %d",&first,&n);
  for(int i=0;i<n;i++){
  	 int address,data,next;
  	 scanf("%d%d%d",&address,&data,&next);
  	 node a;
  	 a.address=address;
  	 a.data=data;
  	 a.next=next;
  	 Node[address]=a;
  }
  

  set<int> s;
  s.insert(abs(Node[first].data));
  int now=Node[first].address;
  int newfirst=-1;
  int newtemp=-1;
  bool flag=true;
  while(Node[now].next!=-1){
  	node no=Node[now];
  	if(s.find(abs(Node[no.next].data))==s.end()){
  		s.insert(abs(Node[no.next].data));
  		now=no.next;
	  }
	else{
		Node[now].next=Node[no.next].next;
		if(flag){
			newfirst=no.next;
			newtemp=newfirst;
			flag=false;
		}
		else{
		Node[newtemp].next=no.next;
			newtemp=no.next;
			
		}
	
		
	}
  }
  now=Node[first].address;
  while(now!=-1){
  	if(Node[now].next==-1)
  		printf("%05d %d -1\n",Node[now].address,Node[now].data);
  	else 
	  printf("%05d %d %05d\n",Node[now].address,Node[now].data,Node[now].next);
  	now=Node[now].next;
  }
  if(newfirst!=-1){
  	Node[newtemp].next=-1;
  	int newnow=Node[newfirst].address;
  while(newnow!=-1){
  	if(Node[newnow].next==-1)
  		printf("%05d %d -1\n",Node[newnow].address,Node[newnow].data);
  	else 
	  printf("%05d %d %05d\n",Node[newnow].address,Node[newnow].data,Node[newnow].next);
  	newnow=Node[newnow].next;
  }
  }
  
}

本题真的踩了不少坑,我的做法和《算法笔记》略有不同,其中要注意的地方有1.注意边界,比如当前node的next值为-1,再让node=node.next就很有可能出错,应该事先判断。一定要注意边界值。并且,我的做法还要判断是不是有要删除的节点(即原链表中是否出现了两个绝对值一样的数),如果没有的话有些操作不应该出现。

相关推荐
GGBondlctrl7 分钟前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康19 分钟前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康22 分钟前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting
成工小白1 小时前
【C++ 】智能指针:内存管理的 “自动导航仪”
开发语言·c++·智能指针
sc写算法1 小时前
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
开发语言·c++·json
SunkingYang1 小时前
C++中如何遍历map?
c++·stl·map·遍历·方法
Andrew_Xzw1 小时前
数据结构与算法(快速基础C++版)
开发语言·数据结构·c++·python·深度学习·算法
库库的里昂1 小时前
【C++从练气到飞升】03---构造函数和析构函数
开发语言·c++
momo卡1 小时前
MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)
c语言·c++·windows