创建链表的过程详解

本人是一名刚开始学习算法的小白,今天遇到了一些关于链表的创建问题,查了一些资料,我把它们整理了一下,希望大家多多指教。

整体的代码:

#include<iostream>
using namespace std;struct Node {int val;Node* next;
};#创建
Node* creatlist(int n) {Node* Head=new Node;    //头节点 不存储数据Head->next = NULL;      Node* pre = Head;  //指向下一个节点的过渡值cout << "请依次输入" << n << "个链表的值:";for (int i = 0;i < n;i++) {Node* temp = new Node;cin >> temp->val;pre->next = temp;pre = temp;temp->next = NULL;   }return Head;
}#显示
void display(Node* head) {Node* temp=head->next;int e;cout << "该链表的遍历依次为:";while (temp!=NULL) {e = temp->val;cout << e << " ";temp = temp->next;}cout << "\n";
}int main() {int nums;cout << "请输入链表的长度:";cin >> nums;Node* head = creatlist(nums);display(head);return 0;
}

解释

1、基本概念:
链表是物体存储单元上不连续的储存结构,数据元素是由链表上的指针所连接。
每个节点都包含两部分:存储数据的数据域,和存储下一个节点的地址的指针域。

根据上图,利用数据结构struct建立一个节点:

struct Node {int val;    //数据域Node* next;  //指数域
};

创建链表:

#创建
Node* creatlist(int n) {//头节点 不存储数据,指针域指向空Node* Head=new Node;    Head->next = NULL; //为了让节点连接成链接,定义pre,最开始pre等于Head    Node* pre = Head;  cout << "请依次输入" << n << "个链表的值:";for (int i = 0;i < n;i++) {//每次循环都创建一个新的节点Node* temp = new Node;//把值赋给temp节点的数据域cin >> temp->val;//pre的指数域指向的下一个节点temp,把pre和temp连接起来pre->next = temp;//把temp节点赋给pre,重新定义prepre = temp;//在下次for循环再一次创建新temp节点前,temp的指数域指向空temp->next = NULL;  }//把头节点返回,知道头节点,节点与节点之间又相互连接,所以知道每个节点中的值return Head;
}

Node* pre 在这个程序中的作用是将不同节点连接成链接,
最开始pre等于head,pre的指数域指向temp1,然后将temp1赋给pre,temp1的指数域指向空,
下次循环建立temp2,pre的指数域指向temp2,然后将temp2赋给pre,temp2的指数域指向空。

创建链表的关键是要把节点连接起来,也就是要让前一个节点的指针域指向下一个节点:

显示链表:只要输入链表的头节点,就可以不断通过节点的指向来显示出所有节点的val:

void display(Node* head) {Node* temp=head->next;int e;cout << "该链表的遍历依次为:";while (temp!=NULL) {e = temp->val;cout << e << " ";temp = temp->next;}cout << "\n";
}

习题1:合并两个链表

class Solution {public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode* preHead = new ListNode(-1);ListNode* prev = preHead;while (l1 != nullptr && l2 != nullptr) {if (l1->val < l2->val) {prev->next = l1;l1 = l1->next;} else {prev->next = l2;l2 = l2->next;}prev = prev->next;}// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可prev->next = l1 == nullptr ? l2 : l1;return preHead->next;}
};

习题2:删除链表中的元素

struct Node {int data;Node* next;
};int Delete(int i) {          //删除i处的数据Node* temp;temp = Head;int j = 0;while (temp && j < i - 1) {temp = temp->next;j++;}if (!temp || j > i - 1) {cout << "删除位置错误";return -1;}else {Node* s;s = temp->next;temp->next = s->next;delete s;}
}
 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};ListNode* deleteDuplicates(ListNode* head) {ListNode* pre=head;while(pre!=NULL && pre->next!=NULL){if(pre->val == pre->next->val){pre->next = pre->next->next;}else{pre = pre->next;}}return head;}

习题3:判断两个链表是否相交

解法一:双指针法

可以理解成两个人速度一致, 走过的路程一致。那么肯定会同一个时间点到达终点。如果到达终点的最后一段路两人都走的话,那么这段路上俩人肯定是肩并肩手牵手的。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if(headA==NULL||headB==NULL) {return NULL;}ListNode *p1=headA;ListNode *p2=headB;while(p1!=p2){p1= p1==NULL?headB:p1->next;p2= p2==NULL?headA:p2->next;}return p1;}
};

解法二:暴力法

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *p1=headA;ListNode *p2=headB;while(p1!=p2){p1= p1==NULL?headA:p1->next;p2= p2==NULL?headB:p2->next;}return p1;}
};

解法三:哈希表法

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {unordered_set<ListNode*> set;ListNode* hA = headA; ListNode* hB = headB;while(hA) {set.insert(hA);hA = hA->next;}while(hB) {if(set.count(hB) == 1) return hB;hB = hB->next;}return NULL;}
};

参考:

链接: 用c++写一个链表

链接: 哔哩哔哩视频

C++:创建链表的过程详解相关推荐

  1. Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)

    Java Web 开发 Java Web 开发概念 搭建过程 详解 在eclipse创建Dynamic Web Project 创建时选择Tomcat的版本 创建项目成功 eclipse环境下如何配置 ...

  2. 个人Internet网站创建过程详解

    个人Internet网站创建过程详解 本文通过创建Internet示范网站--自由网络(Webfree)的实例,详细叙述了Windows NT安装.WWW服务.FTP服务的配置.邮件服务.新闻讨论组服 ...

  3. Spring源码分析之Bean的创建过程详解

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...

  4. Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)

    Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载) Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量, ...

  5. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  6. centos7 启动流程图_Linux启动过程详解

    Linux启动过程详解 作者:江远航 一.启动流程图如下 图1 Linux启动流程图 BIOS ---> MBR ---> Kernel---> Init 二.Linux启动顺序 一 ...

  7. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  8. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  9. #转载:杨辉三角形实现过程详解-c语言基础

    杨辉三角形实现过程详解-C语言基础 十一一个人 2018-12-26 06:45:45 6465 收藏 28 最后发布:2018-12-26 06:45:45首发:2018-12-26 06:45:4 ...

最新文章

  1. Android 绘制同心圆 (2个圆叠加在一起)
  2. python语言只采用解释一种翻译方式对吗_python-guide翻译
  3. 基于java的IO流的文件读取系统
  4. python可以在线编程吗-有哪些 python 的在线练习题或编程挑战的网站?
  5. RTMP直播应用与延时分析
  6. windows7 安装MySQL 解决报错 服务没有响应控制功能
  7. html页面左右布局透明背景,HTML透明背景
  8. JQuery根据关键字检索html元素并筛选显示
  9. Exception in thread main java.lang.NoClassDef...
  10. Linux篇 | 磁盘存储和文件系统
  11. 亿阳防火墙-命令行指令参考手册
  12. C4D插件:阿诺德Arnold渲染器 (R20-26版本合集)
  13. 《Linux程序设计》 - 《Linux高级程序设计》 - 《Unix环境高级编程》
  14. unity实现前后左右移动代码_Unity实现物体左右移动效果
  15. 苹果手机如何快速的直接从相册里面的图片提取文字?
  16. Linuxnbsp;用命令行打开docnbsp;pdf…
  17. 8.19! 今天我有18生日,点击阅读或顶部 尾随幸运的一天!生日知识!↓——【Badboy】...
  18. oracle- 审计日志
  19. 如何操作 Office Open XML 格式文档(转)
  20. HTML添加背景音乐/视频

热门文章

  1. CSRF验证失败. 请求被中断.
  2. 计算机与教育技术学的关系,信息技术和现代教育技术的关系
  3. ASP.NET就业实例视频教程(1)基础入门——搭建网站开发环境教学视频-徐照兴-专题视频课程...
  4. twilio php 发送短信,php - PHP,Twilio SMS-捕获twilio的响应 - SO中文参考 - www.soinside.com...
  5. 感谢刘遄老师,认证《Linux就该这么学》
  6. 字符串函数的介绍带模拟_strcmp
  7. 利用卫星影像进行海岸线提取
  8. Java SE 基础一
  9. 最大稳定极值区域(MSER-Maximally Stable Extremal Regions)
  10. 手机触控事件touch