#include <iostream>

using namespace std;

struct Node{
    int val;
    Node* next;
    
    Node(int _val) : val(_val), next(NULL){}
    //这行的意思是把下面传过来的1赋值给_val然后把_val赋值给val所以val = 1 把NULL赋值给next 也就是空指针
    //这行是构造函数 可以通过下面的Node(1)调用
};

int main(){
    // Node node = Node(1);
    // Node* p = &node;
    
    Node* p = new Node(1);//Node(1)表示定义了一个Node类型的变量 值是1
                            //new Node(1)表示的是定义了一个值是1的Node类型的变量他的返回值是这个变量的地址
                            //如果不加new返回的是值 加new返回的是地址
    
    // 生成一个结构体 将结构体的地址放到p指针里 这个函数叫new
    
    // p->next = p;//意为next的指针指向自己
    //->表示如果想调用某一个类或者结构体里面的成员变量的时候
    //如果调用成员变量本身是一个变量不是一个指针的话
    //是下面这么调用的
    // Node a = Node (1);
    // a.next, a.val;
    
    // 如果调用的成员变量他是一个地址而不是一个变量也就是一个指针的话
    // 就要用->来调用
    // p->next = p;就相当于p.next = p 当然两个意思不一样
    
    
    
    
    // p->val;
    
    auto q = new Node(2);//由于new Node(2)会返回一个Node*类型 这是可以推断出来的所以可以写auto
    auto o = new Node(3);
    p->next = q;//p是一号节点地址 q是二号节点地址
    //这句话的意思是让p里的指针next指向q
    q->next = o;//让q后面加接一个o
    
    //如果有前面指针指向后面 后面指针指向前面的话 一般称为双链表
    // 这个p就称为链表的头节点//这个链表被称为单链表因为是前面指向后面 大部分情况下说的是头节点的地址而不是头节点本身
    
    
    return 0;
}