当前位置: 首页 > news >正文

C++:从0开始学习链表(练习)

上一次我们学习了链表的基本概念和操作,今天我们来写几道链表的练习题,来巩固知识

1.力扣206反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

思路:

可以将链表的指针反转,使后一个指针指向前一个指针,但是要注意存储后一个指针的下一个指针的地址,否则会造成后面数据的丢失

class Solution {
public:ListNode* reverseList(ListNode* head) {//slow指针指向空,即头指针的前一个指针ListNode* slow = nullptr;//fast指针指向头指针ListNode* fast = head;while(fast){ListNode* fnxt = fast->next;fast->next = slow;slow = fast;fast = fnxt;}return slow;//此时slow指针指向反转完链表的头节点}
};

  

2.力扣24两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

思路:

        创建一个虚拟头节点,然后用上一题相似的方法,依次将每个节点的指针反转

class Solution {
public:ListNode* swapPairs(ListNode* head) {//创建虚拟头节点,并插入链表ListNode* vnode = new ListNode(0);vnode->next = head;head = vnode;//创建一个节点p存储虚拟头节点0ListNode* p = vnode;while(p->next&&p->next->next){ListNode* slow = p->next;//slow指向第一个元素1ListNode* fast = p->next->next;//fast指向第二个元素2ListNode* fnxt = fast->next;//fnxt指向第三个元素3//反转链表p->next = fast;//将0->2fast->next = slow;//2->1slow->next = fnxt;//1->3//此时链表为0->2->1->3->4->5->6p = slow;//更新p到需要处理的元素前一位,即3的前一位,也就是slow指向的位置}//将虚拟头结点删去head = vnode->next;//返回链表头节点return head;}
};

    

3.力扣19.删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

思路:

        创建一个虚拟头节点,使用slow和fast两个指针指向虚拟头节点,将fast指针先移动n个元素,再将两个元素一起移动,直到fast指针到尾部时,slow指针刚好指向要删除元素的前一个元素

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* vnode = new ListNode();//虚拟头节点vnode->next = head;//两个指针指向虚拟头节点ListNode* fast = vnode;ListNode* slow = vnode;//将快指针fast先移动n个元素for(int i = 0;i<=n;i++){if(fast == nullptr) return head;//如果移动过程中已经到尾节点,说明链表没有倒数第n个元素fast = fast->next;}//将两个指针一起移动while(fast){fast = fast->next;slow = slow->next;}//最后slow指针指向要删除元素的前一个元素slow->next = slow->next->next;return vnode->next;}
};

      

4.力扣876链表的中间节点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

思路:

        由于要找中间节点,所以快指针的遍历速度是慢指针的两倍,这样当快指针遍历结束时,慢指针刚好指向中间节点

class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode* fast = head;//快指针ListNode* slow = head;//慢指针//循环条件为://奇数:快指针指向的下一个元素为nullptr则慢指针到达中间节点//偶数:快指针指向的元素为nullptr,则慢指针指向第二个中间节点    while(fast&&fast->next){fast = fast->next->next;//快指针两倍速度遍历slow = slow->next;}return slow;}
};

      

5.力扣160相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

思路:

        创建两个指针分别指向两个链表的头节点,两个指针同时分别遍历两个链表,当一个指针遍历完其指向的链表时,将其重新指向另一个链表的头节点继续遍历.

        这样如果两个链表有相交,则两个指针会指向同一个元素,循环停止.如果没有相交,当两个指针都遍历完两个链表时,会同时指向两个尾节点nullptr,循环也会停止

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode* pa = headA;//pa遍历headAListNode* pb = headB;//pb遍历headBwhile(pa!=pb){//循环条件为两个指针指向不相同if(pa==nullptr){//当pa遍历完headA时,继续遍历headBpa = headB;}else{//遍历链表pa = pa->next;}if(pb == nullptr){//当pb遍历完headB时,继续遍历headApb = headA;}else{//遍历链表pb = pb->next;}}//如果有相交,则pa会指向相交的节点//如果不相交,pa最终和pb一起指向nullptrreturn pa;}
};

        这是五题力扣上的关于链表操作的相对简单的算法题,大家可以通过这几题,再理解理解链表的指针域和值域的关系,以及每个链表节点之间的关系

http://www.dtcms.com/a/503763.html

相关文章:

  • JAVA的Set集合类
  • linux系统中进程控制
  • 网站域名注册证书是什么视频拍摄设备
  • 下载 LibreCAD 并创建个人分支的 Git 操作指南
  • 石家庄大型网站建站网站开发能从事那些职业
  • JavaScript性能优化实战大纲性能优化的核心目标
  • 【Android】布局优化:include、merge、ViewStub的使用及注意事项
  • PHP 桌面端框架NativePHP for Desktop v2 发布!
  • 第7章 muduo编程示例(2)
  • 哪里有放网站的免费空间无锡市政务服务网站建设项目
  • 为什么Unity修改过物体,物体的位移和旋转还是会被改变
  • Dify 平台从 x86_64 迁移至 ARM64 架构完整指南
  • 站嗨建站适合小白的室内设计软件
  • 基于车速预测的燃料电池混合动力汽车能量管理策略:一种自适应ECMS方法及其Python实现
  • [嵌入式系统-149]:新能源汽车的三电系统以及其功能、硬件架构、嵌入式操作系统
  • 在iStoreOS系统中安装Docker:从基础到高级应用的完整指南
  • 建设银行 网站查询密码杭州清风室内设计学校
  • 专业的个人网站建设商务网站建设与维护 ppt
  • 《Python红队攻防零基础脚本编写:入门篇(二)》
  • 装修设计网站免费婚庆网站建设策划案费用预算
  • 限制GIT提交大文件
  • STM32F103C8T6_IIC协议详解
  • 几个好用的在线网站南京网络营销
  • 乐学LangChain(1):总体架构和核心组件
  • CAN 总线物理层介绍
  • yolo介绍
  • 中国建站公司网站电线电话图怎么做
  • 新华路街道网站建设企业为什么要建设电子商务网站
  • UVa 1630 Folding
  • 基于AT89C52的智能温控风扇设计