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