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就很有可能出错,应该事先判断。一定要注意边界值。并且,我的做法还要判断是不是有要删除的节点(即原链表中是否出现了两个绝对值一样的数),如果没有的话有些操作不应该出现。

相关推荐
小镇敲码人7 小时前
剖析CANN框架中Samples仓库:从示例到实战的AI开发指南
c++·人工智能·python·华为·acl·cann
刘琦沛在进步7 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
我在人间贩卖青春8 小时前
C++之this指针
c++·this
云姜.8 小时前
java多态
java·开发语言·c++
CoderCodingNo8 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
陳10308 小时前
C++:红黑树
开发语言·c++
大闲在人9 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
一切尽在,你来9 小时前
C++ 零基础教程 - 第 6 讲 常用运算符教程
开发语言·c++
小熳芋9 小时前
443. 压缩字符串-python-双指针
算法
Charlie_lll9 小时前
力扣解题-移动零
后端·算法·leetcode