1.1链表青铜挑战笔记

这篇具有很好参考价值的文章主要介绍了1.1链表青铜挑战笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0.C语言中如何构造链表

  • 为每一个元素配一个指针,每个元素的指针都指向自己的直接后继元素。
  • 逻辑关系:一对一 
  • 1.1链表青铜挑战笔记,链表,笔记,数据结构

 0-1链表基本结构:结点(数据域+指针域)

数据域:存储元素的值

指针域:存放指针

0-2构造方法

typedef struct link{

        char elem;     //代表数据

        struct link *next;      //代表指针,指向直接后继元素

}Link;

struct ListNode* initLink() [
        int i;
        //1、创建头指针
        struct ListNode* p = NULL;
        //2、创建头结点
        struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        temp->val = 0 ;
        temp->next = NULL:
        //头指针指向头结点
        p = temp;
        //3、每创建一个结点,都令其直接前驱结点的指针指向它

        for (i = 1; i < 5; i++) {
                //创建一个结点
                struct ListNode* a = (struct ListNode*)malloc(sizeof(struct ListNode));
                a->val = i;
                a->next = NULL;
                //每次 temp 指向的结点就是 a 的直接前驱结点
                temp->next = a;
                //temp指向下一个结点(也就是a),为下次添加结点做准备temp = temp->next;

        }
return p;

}

测试方法:

int main() (
        struct ListNode*p = NULL;

        printf("初始化链表为: n”);

        //创建链表{1,2,3,4}

        p = initLink();

        return 0;

}

1.链表插入及处理

1.1在首部增加元素

易出现问题:忘记head重新指向表头

步骤:(1)newNode->next = head;       //在表头新增加一个结点,后继是head

           (2)head = newNode;                 //让head重新做回表头

1.2在中间增加元素

易出现问题:在中间增加元素需要连接左右两边的结点,要先连右边,再连左边,如果操作反向则会导致原来的后继结点路径丢失

步骤:(1)newNode->next = Node->next;

           (2)Node->next = newNode;

1.3在尾部增加元素

较易,只需将尾结点指向新结点即可

链表插入三种方法代码:

struct ListNode* insertNode(struct ListNode* head, struct ListNode* nodeInsert, int position) {
        if (head == NULL) {

                // 这里可以认为待插入的节点就是链表的头节点,也可以抛出不能插入的异常

                return nodeInsert;

        }
        int size = getLength(head);

        if (position > size + 1  position < 1) {  

                printf("位置参数越界");
                return head;

        }
        // 插入节点到头部
        if (position == 1) {

                nodeInsert->next = head;

                head = nodeInsert;

                return head;

        }
        struct ListNode* pNode = head;

        int count = 1;

        // 遍历链表,找到插入位置的前一个节点

        while (count < position - 1) {

                pNode = pNode->next;

                count++;
                nodeInsert->next = pNode->next;

                pNode->next = nodeInsert;
                return head;

        }

测试方法:

void testInsert(
        struct ListNode* head = NULL;
        struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));

        node->val=1;

        //插入第一个元素
        head=insertNode(head ,node ,1);

        printList(head);
        //插入第二个元素,在尾部插入

        node = (struct ListNode*)malloc(sizeof(struct ListNode));

        node->val=3;

        head=insertNode(head ,node ,2);
        printList(head);
        //插入第二个元素,在中间插入

        node = (struct ListNode*)malloc(sizeof(struct ListNode));

        node->val=2;

        head=insertNode(head ,node,2);

        printList(head);

}

2.链表删除及处理

2.1删除首部元素

较易,只需head = head -> next即可,将头指针直接移到下一个结点

2.2删除中间元素

删除时要找到被删除结点的前驱结点,即node->next = 被删结点,然后直接node->next = node ->next ->next即可删除

2.3删除尾部元素

同删除中间元素,只要找到被删除节点的前驱结点,然后node->next = null即可删除

删除元素

struct ListNode* deleteNode(struct ListNode*head, int position){

        if (head == NULL) {
                return NULL;

        }
        int size = getLength(head);

        if (position > size  position < 1) {

                printf("输入的参数有误\n");

                return head;

        }
        if (position == 1) {

                return head->next;

        else {
        struct ListNode* preNode = head;

        int count = 1;

        while (count < position - 1) {

        preNode = preNode->next;

        count++;
        struct ListNode*curNode = preNode->next;

        preNode->next = curNode->next;

        free(curNode);       

        return head;

        }

}

测试方法:

void testDelete(){
        struct ListNode* p = NULL;printf("create list: t\n");

        //创建链表0-9

        p = initLink();

        printList(p);
        // 删除第一个元素0

        p= deleteNode(p,1);

        printList(p);
        //删除中间元素

        p= deleteNode(p,5);

        printList(p);
        //删除末尾元素9

        p= deleteNode(p,8);

        printList(p);

}

4.双向链表

4.1双向链表的构造

双向链表有两个指针,一个向前*pre,一个向后*next,可方便的移动元素

typedef struct DoubleNode {

        // 数据域

        int data;
        // 指向下一个结点

        struct DoubleNode *next;

        struct DoubleNode *prev;

}DoubleNode;
        // 创建新结点

DoubleNode* newNode(int data) {
        DoubleNode *newNode = (DoubleNode*)malloc(sizeof(DoubleNode));

        newNode->data = data;

        newNode->next = NULL;

        newNode->prev = NULL;        

        return newNode;

}
        //打印结点的数据域
void displayNode(DoubleNode *node){

        printf("%d",node->data);

}

void traverse(DoubleNode *head){

        DoubleNode *p = head;

        // 定义指针p,指向头节点

        while (p != NULL){

                printf("%d",p->data);

                // 输出当前节点的数据域值

                p = p->next;

                // 移动指针p到下一个节点

        }

}

4.2双向链表的插入

目前不太理解,后期补代码文章来源地址https://www.toymoban.com/news/detail-616997.html

4.3双向链表的删除

目前不太理解,后期补代码

到了这里,关于1.1链表青铜挑战笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村第一关 | 链表青铜挑战笔记

    一、 什么是链表? 链表是一种比较简单、很常见的数据结构,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 二、链表的特点 链表是一种比较简单、很常见的数据结构,是线性表(List)的一种,是一种物理存

    2024年02月14日
    浏览(36)
  • 算法通关村第一关-链表青铜挑战笔记

    平时我们一般都是用数组,每个数组都会有一个相对应的索引,这样就使得数组能够方便的调用出对应索引得到需要的数据,但是这也造成了一个问题,那就是不好在数组中插入或者删除一个数据,例如 int arr[]={1,2,4,5}如果我想在数组中的2和4中添加一个数据3 那么我们首先就

    2024年02月15日
    浏览(41)
  • 算法通关村第一关——链表青铜挑战笔记

    链表的基本单元就是 节点 ,也就是说链表是由一个一个节点构成的。 而对于节点来说,里面至少会包含一个 指针 和一个 数据元素 ,也就是如下图所示: 其中数据域用来存放数据元素,指针域用来存放指向下一个节点的指针,这样一个一个连接起来的就是链表。如下图所

    2024年02月16日
    浏览(40)
  • 算法通关存第一关------链表青铜挑战笔记

    如上代码其实就已经构造出了一个链表。 定义一个Node结点类,他有两个属性var,和next。由于next是Node类型,这时候next又会指向同为Node类型的对象,这个对象也拥有var,和next两个属性,由此构造出一个链表。 文章最后会有构造链表实例,完整代码。   2.1 插入结点 在插入链

    2024年02月15日
    浏览(35)
  • 算法通关村第一关——链表青铜挑战笔记(单链表)

    在LeeCode中一般这样创建链表 要注意创建一个变量来遍历,不要把head丢掉了 count position - 1可以方便操作,还能防止下标越界(cur为null)

    2024年02月15日
    浏览(37)
  • 【无标题】算法通关村第一关——链表青铜挑战笔记

    算法通关村第一关——链表青铜挑战笔记 C语言是如何构造出链表的 0.定义节点结构 1.建立头指针 2.建立temp指针 3.将节点连起来 3.1 把p指向temp 3.2 设立循环节点a+temp指向a+temp变为a

    2024年02月15日
    浏览(36)
  • [Go版]算法通关村第一关——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月15日
    浏览(45)
  • 算法通关村|青铜挑战----链表

    前言:数据结构的基础:创建+增删改查 学习目标:单链表的创建+增删改查,双链表的创建+增删改查 数据域+指针域 数据域:当前节点的元素值 指针域:当前节点保存的下一个节点的元素的地址,其中最后一个元素的指针域指向null 标准的面向对象的节点的定义: LeetCode中节

    2024年02月15日
    浏览(33)
  • 王道_数据结构 1.1_1数据结构的基本概念&1.1_2数据结构的三要素

    本节主要介绍数据结构的基本概念与三要素 笔记来源: B站 王道 数据结构 数据是 信息的载体 ,是描述客观事物属性的数、字符串所有能输入到计算机中并 被计算机程序识别和处理 的符号的集合。 1、数据元素、数据项概念 数据元素 :是数据的基本单位, 通常作为一个整

    2024年02月22日
    浏览(30)
  • 1.1 数据结构

    2023/6/7 1.1数据结构 数据元素是数据的基本单位。一个数据元素由若干个数据项组成。数据项又分为简单数据项及符合数据项两种。简单数据项不能再分割,符合数据项由若干个数据项组成。 类型是一组值的集合。抽象数据类型(ADT)用一种类型和定义再该类型上的一组操作

    2024年02月08日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包