LeetCode学习记录(链表篇基础操作)

链表基础知识回顾

1. 带头结点/不带头结点

初始化时:
带头:L->next=NULL;
不带头:L=NULL;

2. 链表类型

1.单链表
2.双链表
3.循环链表

3. 存储方式

1.静态存储(定义一整片连续空间)
2.动态存储

4. 链表节点定义

  • 法1
// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};
  • 注意:不定义构造函数是可以的,C++默认生成一个构造函数。但是这个构造函数不会初始化任何成员变量。
  1. 通过自己定义构造函数初始化节点:
ListNode* head = new ListNode(5);
  1. 使用默认构造函数初始化节点:
ListNode* head = new ListNode();
head->val = 5;

所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!

  • 法2
// 单链表
typedef struct LinkNode{
	ElemType data;
	LinkNode *next;
}LinkNode;

5. 基本操作

a) 带头节点
  1. 初始化
//定义单链表节点
typedef struct LinkNode
{
    int data;
    struct LinkNode* next;
} LinkNode;

//初始化一个带头结点的链表
void InitList(LinkNode*& L)
{
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
}
  1. 头插法建立单链表,从键盘中输入
//头插法,键盘输入的方式建立链表
void InsertLink_byhead(LinkNode*& L)
{
    LinkNode* s;
    int x, length;
    printf("请输入你要插入元素个数:\n");
    scanf("%d", &length);
    printf("请输入元素:\n");
    for (int j = 0; j < length; j++)
    {
        s = (LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d", &x);
        s->data = x;
        s->next = L->next;
        L->next = s;
    }
}
  1. 尾插法建立单链表,从键盘中输入
//尾插法,键盘输入的方式建立链表
void InsertLink_bytail(LinkNode*& L)
{
    LinkNode* s, * p;
    p = L;
    int x, length;
    printf("请输入你要插入的元素个数:\n");
    scanf("%d", &length);
    printf("请输入元素:\n");
    for (int j = 0; j < length; j++)
    {
        s = (LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d", &x);
        s->data = x;
        p->next = s;
        p = s;
    }
    p->next = NULL;//最后置为空
}
  1. 输出单链表元素
//输出单链表
void PrintLinkNode(LinkNode*& L)
{
    LinkNode* s = L->next;
    printf("单链表元素如下:\n");
    while (s != NULL) {
        printf("%d ", s->data);
        s = s->next;
    }
    printf("\n");
}
b) 带头节点

1.初始化

1. 初始化
//定义单链表节点
typedef struct LinkNode
{
    int data;
    struct LinkNode* next;
} LinkNode;

//初始化链表,不带头节点
void InitLinkList(LinkNode*& L)
{
    L = NULL;
}
  1. 头插法建立单链表,不带头节点
//头插法建立单链表,不带头节点
void InsertList_byhead2(LinkNode*& L)
{
    int len, x;
    LinkNode* p;
    printf("请输入您要插入的元素个数\n");
    scanf("%d", &len);
    printf("请输入元素:\n");
    for (int j = 0; j < len; j++)
    {
        p = (LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d", &x);
        p->data = x;
        p->next = L;
        L = p;
    }
}
  1. 尾插法建立单链表,不带头节点
//尾插法建立单链表,不带头节点
void InsertList_bytail2(LinkNode*& L)
{
    int len, x;
    LinkNode* p, * s;
    s = L;
    printf("请输入您要插入的元素个数\n");
    scanf("%d", &len);
    printf("请输入元素:\n");
    for (int j = 0; j < len; j++)
    {
        p = (LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d", &x);
        p->data = x;
        if (L == NULL)
        {
            L = p;
            s = p;
        }
        else
        {
            s->next = p;
            s = p;
        }
        s->next = NULL;
    }
    s->next = NULL;
}
  • 注意,第一个元素插入时需要判断
 if (L == NULL)
    {
        L = p;
        s = p;
    }

6.参考

单链表基本操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值