首页 > 其他分享 >pat乙级链表问题

pat乙级链表问题

时间:2023-02-26 12:33:16浏览次数:58  
标签:pat int list 乙级 next 链表 ans data

链表题目:一开始以为要按照链表那样一个一个搞,看完这个后思路清晰:1025链表一连a三题链表题。在输入完链表之后,遍历链表使用另一个数组(可以是指针数组也可以是节点数组)记录下该节点的地址或者将节点的顺序调对,并且记录有多少个节点(加个变量记录就行,还可以用来作为变化的数组下标),读到-1停止。然后就进行对应的操作输出就行了,
以下代码来自柳婼和上面那个链接
1025:反转链表

	#include <iostream>  
	#include <algorithm>  
	using namespace std;  
	int main() {  
		int first, k, n, temp;  
		cin >> first >> n >> k;  
		int data[100005], next[100005], list[100005];  
		for (int i = 0; i < n; i++) {  
			cin >> temp;  
			cin >> data[temp] >> next[temp];  
			}  
		int sum = 0;//不⼀定所有的输⼊的结点都是有⽤的,加个计数器  
		while (first != -1) {  
			list[sum++] = first;  
			first = next[first];  
			}  
		for (int i = 0; i < (sum - sum % k); i += k)  
			reverse(begin(list) + i, begin(list) + i + k);  
		for (int i = 0; i < sum - 1; i++)
			printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);  
			printf("%05d %d -1", list[sum - 1], data[list[sum - 1]]);  
		return 0;  
	}
	#include<iostream>
	#include<algorithm>
	using namespace std;
	struct List
	{
		int id;
		int date;
		int next;
	};
	int main()
	{
		struct List p[100000+10];//链表结构体 
		struct List *q[100000+10];//存放链表结构体地址的数组
		int first,num,ty;
		cin>>first>>num>>ty;
		int ID,Date,NEXT;//暂时存放 
		for (int i = 0; i < num; i++) //读数据 
		{
			cin>>ID>>Date>>NEXT;
			p[ID].date=Date;
			p[ID].next=NEXT; 
			p[ID].id=ID;
		 }
		int tk=0; 
		for(int i=first;i!=-1;i=p[i].next)//将数据按顺序存放到指针数组q中 
		{
			q[tk++]=&p[i];
		 } 
		for(int i=tk,j=0;i/ty!=0;i-=ty,j+=ty)
		{
			reverse(q+j,q+j+ty);//逆序指针数组  原来数组存放的链表地址进行逆序 
		}
		for( int i=0;i<tk-1;i++)
		{
			printf("%05d %d %05d\n",q[i]->id,q[i]->date,q[i+1]->id);
		}
		printf("%05d %d -1",q[tk-1]->id,q[tk-1]->date);
		return 0;
	}

1075:链表元素分类

		将结点⽤list[10000]保存, list为node类型, node中保存结点的值value和它的next地址。 list的下标就是结点的地址。将<0、 0~k、 >k三部分的结点地址分别保存在v[0]、 v[1]、 v[2]中,最后将vector中的值依次输出即可  .即只遍历一次,减少遍历次数
		#include <iostream>  
		#include <vector>  
		using namespace std;  
		struct node {  
		int data, next;  
		}list[100000];  
		vector<int> v[3];  
		int main() {  
			int start, n, k, a;  
			scanf("%d%d%d", &start, &n, &k);  
			for (int i = 0; i < n; i++) {  
				scanf("%d", &a);  
				scanf("%d%d", &list[a].data, &list[a].next);  
				}  
			int p = start;  
			while(p != -1) {  
				int data = list[p].data;  
				if (data < 0)  
				v[0].push_back(p);  
				else if (data >= 0 && data <= k)  
				v[1].push_back(p);  
				else  
				v[2].push_back(p);  
				p = list[p].next;  
				}  
			int flag = 0;  
			for (int i = 0; i < 3; i++) {  
				for (int j = 0; j < v[i].size(); j++) {  
					if (flag == 0) {  
						printf("%05d %d ", v[i][j], list[v[i][j]].data);  
						flag = 1;  
						} 
					else {  
					printf("%05d\n%05d %d ", v[i][j], v[i][j], list[v[i][j]].data);  
					}  
				}  
			}  
			printf("-1");  
			return 0;  
		}

1105:链表合并:⽤vector L1、 L2存储题⽬中给定的两个链表, vector ans保存合并后的链表。将较⻓的⼀个链表存储在L1中,如果原本L1较短,则将L1与L2⽤swap函数互相置换~在链表合并的过程中, i从0开始,将L1中每个结点添加到ans中,如果当前i是奇数(i & 1不等于0)就把L2的⼀个结点添加到ans中,直到L2中没有剩余元素,反复,我是遍历了两遍,然后如果大小区分就swap首地址。

#include <iostream>  
#include <vector>  
using namespace std;  
struct node {  
int data, next;  
}A[100000];  
vector<int> L1, L2, ans;  
int sa, sb, n, a, ta, tb, c;  
int main() {  
	cin >> sa >> sb >> n;  
	for (int i = 0; i < n; i++) {  
		cin >> a >> A[a].data >> A[a].next;  
	}  
	ta = sa;  
	while (ta != -1) {  
		L1.push_back(ta);  
		ta = A[ta].next;  
	}  
	tb = sb;  
	while (tb != -1) {  
		L2.push_back(tb);  
		tb = A[tb].next;  
		}  
	if (L1.size() < L2.size()) swap(L1, L2);  
	for (int i = 0, c = L2.size() - 1; i < L1.size(); i++) {  
		ans.push_back(L1[i]);  
		if (i & 1 && c >= 0) ans.push_back(L2[c--]);  
		}  
		for (int i = 1; i < ans.size(); i++) {  
		printf("%05d %d %05d\n", ans[i-1], A[ans[i-1]].data, ans[i]);
	}  
	printf("%05d %d -1", ans.back(), A[ans.back()].data);  
	return 0;  
	}

标签:pat,int,list,乙级,next,链表,ans,data
From: https://www.cnblogs.com/ahappyfool/p/17156470.html

相关文章

  • 时间击败100%用户的快慢指针删除链表中的倒数第n个节点算法
    //给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 ///***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNoden......
  • 单链表的翻转
    单链表的翻转//链表定义structSingleLinkedList{intvalue;structSingleLinkedList*next;};//打印链表中的数据voidprintAllNodes(structSingleLinkedList......
  • The bean ‘api‘, defined in class path resource [com/common/swagger/SwaggerAuto
    Thebean‘api‘,definedinclasspathresource[com/common/swagger/SwaggerAutoConf1.解决办法-1将重复的bean覆盖掉加一个这个注解spring.main.allow-bean-definit......
  • 链表链表相交
    leetcode:链表相交Method判断链表相交否,先看两个链表的长度,使得长链表移动长度之差绝对值的长度,移动后的两个新链表长度一样,在判断两个节点是否地址相同代码/***Def......
  • PAT Basic 1007. 素数对猜想
    PATBasic1007.素数对猜想1.题目描述:让我们定义\(d_n\)为:\(d_n=p_{n+1}−p_n\),其中\(p_i\)是第\(i\)个素数。显然有\(d_1=1\),且对于\(n>1\)有\(d_n\)是偶数。“素数对......
  • PAT Basic 1006. 换个格式输出整数
    PATBasic1006.换个格式输出整数1.题目描述:让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超......
  • 链表:删除倒数第N个节点
    思路这道题如果是暴力,其实可以先反转,在删除,在反转,麻烦Method双指针:思路:建立一个头节点node,然后fast和slow指针都指向node,然后fast先跑n+1距离,fast先走,就会与slow......
  • PAT Basic 1005. 继续(3n+1)猜想
    PATBasic1005.继续(3n+1)猜想1.题目描述:卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算......
  • Redis设计与实现—简单动态字符串、链表、字典
    前言《Redis设计与实现》数据结构部分有关字符串类型介绍。@目录前言一、数据结构——简单动态字符串1.1SDS定义1.2SDS与C字符串的区别1.2.1常数复杂度获取字符串长度......
  • 离线数仓中的拉链表
    拉链表什么是拉链表?​拉链表,记录每条信息的生命周期,一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当前日期放入生效的开始日期。(就是在原来表的基础上,......