静态链表

动态链表:需要指针来建立结点之间的连接关系。
但对于有些问题来说,结点的地址是比较小的整数(例如题目给的5位数字的地址),此时应该使用更加方便的动态链表。

静态链表的实现原理是hash,即通过建立一个结构体数组,并令数组下标直接表示结点的地址,来达到直接访问数组中的元素就能访问结点的效果。
静态链表是不需要头结点的
静态链表结点的定义:

struct node{
	char data;
	int next;
}a[10];

注意:在使用静态链表时,尽量不要把结构体类型名和结构体变量名取成相同的名字。

静态链表题解题步骤:

  1. 定义静态链表。除了值和下一结点的地址,一般还需要定义结点的某个性质XXX(看题);
  2. 需要对链表进行初始化。一般来说是对XXX
for(int i = 0; i < maxn; i ++ ){
	a[i].XXX = 0;
}
  1. 题目一般会给出链表的首结点的地址,可以根据这个地址来遍历得到整条链表。同时也可以对XXX进行标记,例如它是这条链表上的结点,所以把他标记为1。
int p ,count = 0;
for(p = begin; p!= -1; p = a[p].next){
	a[p].xxx = 1;
	count++;
}
  1. 由于使用静态链表时,是直接才用地址映射(hash)的方式,这就导致了数组下标的不连续,而且题目中往往会有无效结点(不存在链表上的结点),为了能够可控地访问有效结点,一般需要对数组进行排序以把有效结点移到数组左端,这样就可以用第三步的count来访问了。
    在写sort的排序函数cmp的时候,就可以在比较两个参数结点中有无无效结点的时候按照XXX从小到大排序,而当两个结点都是有效结点时候按照结点在链表中的位置从小到大排序(结点的顺序在第三步得到)
    一般来说题目中会有额外的要求,就需要写二级排序。
bool cmp(node a, node b){
	if(a.XXX == -1 || b.XXX == -1){	//至少一个结点是无效结点,就把它放到数组后面
		return a.XXX > b.XXX;
	}
	else {
		//第二级排序
	}
}
  1. 此时链表中所有结点都在数组的左端了,且已经按照结点的顺序排序,接下来就看题目的具体要求输出。

PAT相关题目:

PAT 1032 Sharing
PAT 1052 Linked List Sorting (25分)
PAT 1133 Splitting A Linked List (25分)
PAT 1161 Merging Linked Lists (25分)
PAT 1165 Block Reversing (25分)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值