链表的插入
Listnode *newnode = new Listnode(val);
cur -> next = newnode;
cur = cur -> next;
链表的插入主要可以分为这几步:
1.创建一个新的链表节点,初始化它的值为val
Listnode *newnode = new Listnode(val);
通过new构造一个新的链表节点,节点的值为val
new运算符,用于开辟空间,开辟的空间在堆上,而C++中一般声明的变量都是在栈中的;
new得到的是一段空间的首地址。所以一般需要用指针来存放这段地址
使用语法一般是 : 指针变量 = new 数据类型
int *ptr = new int(5); // 分配一个整数内存空间,ptr保存了该内存的地址
int *ptr1 = new int[5];//分配一个储存5个整数的一维数组空间,同样ptr1保存了该内存的地址
###主要括号的不同
2.将新的节点放入到链表的尾部,接入链表,也就是当前链表的尾部的next指向新节点
cur -> next = newNode; // cur节点的next节点是新节点,从而将新节点接入链表
箭头 -> 语法
用于通过指针访问指针所指向的对象的成员,cur 是一个指向 ListNode 结构体对象的指针,而 next 是 ListNode 结构体内部的一个成员变量(指向下一个节点的指针)。使用 cur->next 表示访问 cur 所指向的节点的 next 成员变量。
箭头运算符(->)包括了解引用和点运算符(.)
在c++中,*和&在不同的地方有着不同的意义
具体一些例子:
//有关 * :
int *ptr = &a;//指针
a = a * b; // 乘法
*p = 100 //表指向,就是p是指向100的地址值
// 有关 &:
int c = a&b; //位运算,转换为二进制
int *p = &a;//&表示取a的地址
int a = 100;
int &a1 = a ;//引用
解引用:就是解释引用,就是根据指针标量保存的地址值来找地址值代表的内容
eg:
#include <iostream>
using namespace std;
int main(){
int *ptr ;
int a = 6;
ptr = &a;
cout << ptr <<endl;
cout << *ptr << endl;
}
定义个指向int类型的指针变量,定义个整型a = 6,把a的地址值赋给指针ptr,后面的*ptr就是解引用的过程,就是直接去寻找指针所指的地址里面的内容,此内容可以是任何数据类型,当然也可以是指针。
引用:& 表示引用
引用就像给变量取了个别名,不是新定义一个变量,编译器不会开辟一个新的内存空间,二者共用一个内存空间
格式:
类型 &引用变量名(对象名) = 引用实体
eg:
#include <iostream>
using namespace std;
int main(){
int a = 10;
int &a1 = a;
int b = a;
cout << "a的地址:" << &a << endl;
cout << "a1的地址:" << &a1 << endl;
cout <<"b的地址:"<< &b << endl;
cout << "a1值"<<a1 << endl;
cout << "b值" << b << endl;
//改变a的值,a1也会改变,但B不会改变,因为b是新开辟的内存
a = 18;
cout << "改变后a1值" << a1 << endl;
cout << "改变后b值" << b << endl;
}
结果:
点运算符
又叫成员访问运算符,用于访问一个对象的成员变量或成员函数,字面意思,很好理解,跳过
#include <iostream>
using namespace std;
struct Listnode
{
int value;
Listnode *next;
Listnode(int x) : value(x),next(nullptr) {}
};
int main(){
Listnode *cur = new Listnode(0);//声明cur指针,指向一个初始化的链表节点
cout << cur -> next << endl;
cout << (*cur).next << endl;
}
结果:
cur -> next 相当于(*cur).next
就是先对指针变量cur解引用,得到了地址值所储存的链表节点,再访问成员变量next
3.新接入的链表节点变为链表的尾部
cur = cur -> next; // 新插入的节点变更为新的尾节点,即cur发生了变更,cur指向后一个结点
完整代码(在一个结点后面插入``新的结点)
#include <iostream>
using namespace std;
//定义一个链表结点结构体
struct Listnode
{
int value;
Listnode *next;
Listnode(int x) : value(x),next(nullptr) {}
};
int main(){
Listnode *dummynode = new Listnode(0);//创建一个虚拟节点
Listnode *cur = dummynode; // cur指针指向虚拟节点
Listnode *newnode1 = new Listnode(1);//再声明一个新结点,目的是想将其插入到虚拟结点的后面
Listnode *newnode2 = new Listnode(2);//再来一个
cur -> next = newnode1;
cur = cur -> next;
cur -> next = newnode2;
cur = cur -> next;
cur = dummynode;
// 按顺序输出除虚拟节点外所有结点的val
while (cur -> next != NULL){
cout << cur -> next -> value << " ";
cur = cur ->next;
}
}
结果: