链表

【引子】平时我们习惯运用数组进行各类元素的存储,但是一旦插入元素时可能会引起大量下标中元素的转移,于是造成的超时后果就不用说了。那么我们如何解决这个问题呢?
【正题】解决方法是采用链表。链表的意思就和字面上一样,一条链。是不是有种和数组很像的感觉?显然,二者是有明显区别的。什么是链表呢,想象相邻元素之间用链接起来,这样插入和删除的实现就很简单了。

             ①插入:在a-b之间插入c,即断开ab间的链,将a与c接链,c与b接链,就形成了a-c-b!神奇!

             ②删除:在a-c-b上删除c,即直接将a与b接链,就变成了a-b!神奇!

想法是美好的,实现怎么办???【思索状】

显然,这时我们就需要用特殊的数组或结构体做指针。(单向链表指next,双向链表指next、last)虽然某rj写的是next数组,但是Hans还是喜欢用结构体来写。

【注意】&表示取地址,是取地址,你的地址可以是任何类型(可理解为&得到的是这个变量所占用的空间内存,是个”虚“的东西)
              *是指针,是取地址的内容(可理解为*得到的是这个空间内存所存的具体内容,是个”实“的东西)

【代码】此代码为借鉴模板,不针对任何一题:输入整数n,依次打印出1~n内除3的倍数外的数,并在每个数后打印各自的负数形式...(题面有些迷,自己拷贝程序随便输入一个n就知道了~)

【感悟】①现在还在这里回顾链表,没有人比我更蒟蒻了qwq[[[:3跪下淌血...


#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>

using namespace std;

struct node{
	int x;
	node* next;
	node* last;
};

int main(){
	int n;
	scanf("%d", &n);
	
	node head;
	node* a = &head;
	node* tail;
	/*----构造----*/
	for(int i = 1; i <= n; i++){
		node* tmp = new node();
		tmp -> x = i;
		tmp -> next = NULL;
		tmp -> last = a;
		a -> next = tmp;
		a = a -> next;
	}
	tail = a;
	/*----删除----*/
	// 去掉3的倍数 
	for(node* b = head.next; b != NULL; b = b -> next){		
		if((b -> x) % 3 != 0) {
			tail = b;
			continue;
		}
		if(b -> next != NULL){
			b -> next -> last = b -> last;
		}
		b -> last -> next = b -> next;

		if (b -> next == NULL){
			tail = b -> last;
		}
	}
	/*----添加----*/ 
	//添加每一个数的负数 
	for(node* b = head.next; b != NULL; b = b -> next){
		node*c = new node();
		if(b -> next == NULL){
		    b -> next = c;
			c -> last = b;
			c -> next = NULL;
			c -> x = 0 - (b -> x);
		}
		else{
			c -> next = b -> next;
			b -> next -> last = c;
			c -> last = b;
			b -> next = c;
			c -> x = 0 - (b -> x);
		}
		b = b -> next;
		tail = c;
	}
	/*----打印----*/
	//逆序 
	for (node* b = tail; b != &head; b = b->last) {
		printf("%d ", b->x);
	}
	printf("\n");
	//正序 
	for (node* b = head.next; b != NULL; b = b->next) {
		printf("%d ", b->x);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值