【从零开始写博客】链表运用:链表的增删查改及反转(day3)

这篇具有很好参考价值的文章主要介绍了【从零开始写博客】链表运用:链表的增删查改及反转(day3)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码随想录刷题60天

【数组】day2

【数组】day1


目录

链表概述

一、链表增删地初次理解

二、链表常见六个操作

三,链表的转置

总结


链表概述

链表是通过指针将一个个节点串起来的数据结构,其优点是增删方便,灵活性强。以下将结合leetcode上的一些例题介绍链表的一些功能和应用。


一、链表增删的初步理解

【从零开始写博客】链表运用:链表的增删查改及反转(day3),链表,数据结构

class Solution
 {
 public:
     ListNode* removeElements(ListNode* head, int val)
     {
         ListNode* temp;
         while (head && head->val == val)
         {
                 temp = head;
                 head = head->next;
         }
         //得到新的头节点
         temp = head;
         while (temp && temp->next)//不能交换顺序
         {
             ListNode* temp2;//需要有辅助节点来辅助删除节点
             while(temp->next && temp->next->val == val)
             {
                 temp2 = temp->next;
                 temp->next = temp->next->next;
             }
             temp = temp->next;
         }
         return head;
     }
 };

相比数组依靠覆盖来完成的删除操作,链表这种直接将需要移除节点的左右节点相连的方式要简单省事多了。而唯一需要注意的是——如果链表的节点是用堆储存的,必须将被移除节点释放,以此来避免内存泄漏。

二、链表常见六个操作

【从零开始写博客】链表运用:链表的增删查改及反转(day3),链表,数据结构

   class MyLinkedList 
 {
 public:
     class LinkedNode 
     {
     public:
         int val;
         LinkedNode* next;
     public:
         LinkedNode(int value) :val(value), next(nullptr){}
     };
     LinkedNode* head;
     int size;

 public:
     MyLinkedList()
     {
         head = new LinkedNode(0);
         size = 0;
     
     }

     int get(int index) 
     {
         LinkedNode* cur;
         if (index + 1 > size)
             return -1;
         cur = head->next;
         for (int i = 0; i < index; i++)
             cur = cur->next;
         return cur->val;
     }

     void addAtHead(int val) 
     {
         LinkedNode* temp = new LinkedNode(val);
         temp->next = head->next;
         head->next = temp;
         size++;
     }

     void addAtTail(int val)
     {
         LinkedNode* temp = new LinkedNode(val);
         LinkedNode* cur = head->next;
         while (cur && cur->next)
             cur = cur->next;
         if (cur)cur->next = temp;
         else head->next = temp;
         size++;
     }

     void addAtIndex(int index, int val) 
     {
         if (index > size)return;        
         if (index == 0){ addAtHead(val); return; }
         if (index == size){ addAtTail(val); return; }

         LinkedNode* temp = new LinkedNode(val);
         LinkedNode* cur = head->next;
         for (int i = 1; i < index; i++)
             cur = cur->next;
         temp->next = cur->next;
         cur->next = temp;  
         size++;
     }

     void deleteAtIndex(int index) 
     {
         LinkedNode* temp,*cur;
         if(index + 1 > size)return;
         size--;
         cur = head->next;
         if (index == 0) 
         {            
             head->next = head->next->next;
             delete(cur);
             return;
         }
         while (index > 1)
         {
             cur = cur->next;
             index--;
         }
         temp = cur->next;
         cur->next = cur->next->next;
         delete(temp);        
     }
 };


 int main(int argc, char* argv[])
 {
     MyLinkedList* myLinkedList = new MyLinkedList();
     //myLinkedList->addAtHead(7);
     //myLinkedList->addAtHead(2);
     //myLinkedList->addAtHead(1);

     myLinkedList->addAtTail(1);
     //myLinkedList->addAtIndex(3, 0);    // 链表变为 1->2->3
     cout<<myLinkedList->get(1)<<endl;              // 返回 2
     //myLinkedList->deleteAtIndex(2);    // 现在,链表变为 1->3
     cout<<myLinkedList->get(1)<<endl;              // 返回 3
     //myLinkedList->addAtHead(6);
     //myLinkedList->addAtTail(4);
     //myLinkedList->deleteAtIndex(0);
     cout << myLinkedList->get(0);
     return 0;
 }

在增删操作中有几点需要我们去注意:

1. 在链表创建中,建议保存的链表长度信息,以此来避免在查找某个节点信息或者在某个位置增删节点时,对节点或位置是否有效的额外判断操作。

2. 在链表中,头节点属于链表的其中一个节点。为了避免在对链表进行操作时不小心对头节点的进行修改,推荐使用不可修改的虚拟头节点。用该节点的next指针存储头节点信息。使用该虚拟头节点在一定程度上可以增加在操作链表时的容错率。

三,链表的转置

class Solution {
public:
  ListNode* reverseList(ListNode* head)
     {
         ListNode* pre, * cur,*temp;
         pre = nullptr;
         cur = head->next;//此时的head是虚拟头节点
         while (cur)
         {
             temp = cur->next;
             cur->next=pre;
             pre = cur;
             cur = temp;
         }
         return pre;
     }
};


总结

在链表中,理解好节点与节点的关系是掌握链表这一数据结构的关键所在。学会画图去模拟对链表节点的操作能够有效理解节点之间的关系以及操作链表时的逻辑错误。文章来源地址https://www.toymoban.com/news/detail-610410.html

到了这里,关于【从零开始写博客】链表运用:链表的增删查改及反转(day3)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • MySQL——表的增删查改

    目录 一.Create(创建) 1.单行数据 + 全列插入 2.多行数据 + 指定列插入 3.插入否则更新 4. 替换 二.Retrieve(读取) 1. select 列 查询 2.where 条件 3.结果排序 4.筛选分页结果 三.Update (修改) 四.Delete(删除) 1.删除数据 2.删除整张表数据 3.截断表 4.去重表数据 五.聚合函数 六.g

    2024年02月04日
    浏览(52)
  • 【MySql】表的增删查改

    说明: field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准 collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准 现在创建一张表user1: 创建表user2: 存储引擎不同,此时我们查看user1和user2:建表的时候

    2024年02月08日
    浏览(37)
  • 【MySQL】表的增删查改(进阶)

    目录 1.数据库约束 1.1NOT NULL:非空约束 1.2UNIQUE:唯一值约束 1.3DEFAULT:默认值约束 1.4PRIMARY KEY:主键约束 1.5FOREIGN KEY:外键约束 1.6CHECK约束 2.表的设计 2.1一对一 2.2一对多 2.3多对多 3.新增 4.查询 4.1聚合查询 4.1.1聚合查询 4.1.2GROUP BY 4.2联合查询 4.2.1内连接  4.2.2外连接 4.2.3自连

    2024年02月11日
    浏览(31)
  • 【MySQL】库和表的增删查改

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、库的操作 1、创建数据库 2、数据库所使用的编码 2.1查询编码集和校验集 2.2查看数据库的字符集和校验集 2.3创建数

    2024年02月08日
    浏览(36)
  • 【MySQL】基本查询(表的增删查改)

    CRUD : 四种操作 Create(创建), Retrieve(读取), Update(更新), Delete(删除) 创建一张学生表 查询展示 查询展示 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败 可以选择性的进行同步更新操作 语法: 插入主键冲突把插入操作该为更新操作 创建一张表 全列查询 – 通常

    2024年02月15日
    浏览(32)
  • [MySQL] MySQL 表的增删查改

      本篇文章对mysql表的增删查改进行了详细的举例说明解释。 对表的增删查改简称CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)。 其中 重点是对查询select语句进行了详细解释,并且通过多个实际例子来帮助你的理解 。希望本篇文章会对你有所帮助。  文章目录

    2024年02月04日
    浏览(30)
  • 【MySQL】MySQL表的增删查改(初阶)

    据库最主要的操作就是增(create)删(update)改(retrieve)查(delete)。(CURD) 注意:进行增删改查操作的时候,请务必选中数据库。 SQL中使用 insert 来表示新增。 注意: 每次新增,都是直接新增一行。(一条记录) value后面()中的内容,个数和类型要和表的结构匹配。 在SQL中,’

    2023年04月08日
    浏览(28)
  • 数据结构之顺序表的增删查改

    自今日起,我们正式 越过C语言的大山 ,走向了 数据结构的深山 ,现如今摆在我们面前的第一个坎就是 顺序表 ,我们需要了解顺序表的 定义 ,并且知道,如何对其进行 增删查改 ,之后我们需要在此处基础上写出一份 通讯录代码 ,ok,顺序表,启动! 线性表( linear lis

    2024年01月23日
    浏览(47)
  • C语言—实现循序表的增删查改

    嗨嗨嗨!大家好!今天我为大家分享的是数据结构知识——顺序表。废话不多数,让我们开始今天的知识分享吧。 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构

    2024年04月15日
    浏览(47)
  • 【数据结构】单链表的增删查改(C实现)

    优势 : 可通过 下标i (数据连续(物理空间连续)) 便捷查询查找顺序表中的信息,也会在后面的 排序算法 和 堆算法 中尽显身手 问题 : 在头部/中间的插入与删除需要 挪动数据 ,时间复杂度为O(N),效率低; 增容需要申请新空间, 可能会拷贝数据 ,释放旧空间,会有

    2024年02月05日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包