C++链表一(练习题)
链表存储数据【描述】创建一个链表按顺序存储字母A’~‘E’。从第一个结点依次输出链表中的数据。【输入描述】无【输出描述】按顺序存储字母A’~‘E’【样例输入】无【样例输出】ABCDE#includeiostreamusingnamespacestd;structnode{chardata;// 数据node*next;// 指针};intmain(){// 创建节点node n1{A,NULL};node n2{B,NULL};node n3{C,NULL};node n4{D,NULL};node n5{E,NULL};// 建立连接 n1-n2-n3-n4-n5n1.nextn2;n2.nextn3;n3.nextn4;n4.nextn5;node*headn1;// 指向头节点while(head!NULL){couthead-data;headhead-next;}coutendl;return0;}//本题没有更多的测试用例链表反转【描述】输入一个你喜欢的链表然后将这个链表打印出来同时反转输出原链表【输入描述】输入为一行表示将要输入链表中元素输入的数字必须为整数当输入完毕时以“-1”结尾表示输入完毕【输出描述】输出原链表与反转后链表【样例输入】-2 2 0 4 5 -1【样例输出】原链表: -2 - 2 - 0 - 4 - 5反转后链表: 5 - 4 - 0 - 2 - -2#includeiostreamusingnamespacestd;// 定义链表节点结构体structNode{intdata;Node*next;// 构造函数用于初始化节点值和指针Node(intval):data(val),next(nullptr){}};// 反转链表的函数迭代法实现Node*reverseList(Node*head){Node*prevnullptr;// 前驱节点指针初始化为空Node*currhead;// 当前节点指针初始化为头节点// 遍历链表直到当前节点为空while(curr){Node*nextTempcurr-next;// 保存下一个节点地址curr-nextprev;// 将当前节点指针指向前驱节点prevcurr;// 前驱指针移动到当前节点currnextTemp;// 当前指针移动到下一个节点}returnprev;// 返回新头节点原链表的尾节点}// 打印链表的辅助函数// 功能按顺序输出链表元素节点间用 - 连接voidprintList(Node*head){Node*phead;// 临时指针用于遍历while(p){coutp-data;// 输出当前节点值if(p-next)// 如果非尾节点添加连接符cout - ;pp-next;// 移动到下一个节点}coutendl;// 输出换行符}// 通过手动输入创建链表// 输入规则输入整数序列以-1作为结束标志Node*createListFromInput(){Node*headnullptr;Node*tailnullptr;intval;// 临时存储输入值//输入链表元素输入-1结束while(true){cinval;if(val-1)break;// 输入-1时终止循环// 创建新节点并初始化Node*newNodenewNode(val);if(!head){// 如果链表为空headtailnewNode;// 新节点作为头节点和尾节点}else{// 链表非空时tail-nextnewNode;// 原尾节点指向新节点tailnewNode;// 更新尾节点为新节点}}returnhead;// 返回链表头指针}intmain(){// 手动输入创建链表Node*headcreateListFromInput();// 输出原始链表内容cout原链表: ;printList(head);// 反转链表操作Node*reversedHeadreverseList(head);// 输出反转后的链表内容cout反转后链表: ;printList(reversedHead);return0;}/* 【输入用例2】 1 1 1 1 1 1 1 -1 【输出用例2】 原链表: 1 - 1 - 1 - 1 - 1 - 1 - 1 反转后链表: 1 - 1 - 1 - 1 - 1 - 1 - 1 【输入用例3】 -2 -3 -4 -5 -6 -7 -8 -1 【输出用例3】 原链表: -2 - -3 - -4 - -5 - -6 - -7 - -8 反转后链表: -8 - -7 - -6 - -5 - -4 - -3 - -2 【输入用例4】 -2 -3 -4 0 2 3 4 -1 【输出用例4】 原链表: -2 - -3 - -4 - 0 - 2 - 3 - 4 反转后链表: 4 - 3 - 2 - 0 - -4 - -3 - -2 【输入用例5】 10 20 30 40 50 60 -1 【输出用例5】 原链表: 10 - 20 - 30 - 40 - 50 - 60 反转后链表: 60 - 50 - 40 - 30 - 20 - 10 【输入用例6】 0 -1 【输出用例6】 原链表: 0 反转后链表: 0 */合并两个有序链表【描述】将两个有序的链表合并后输出链表1与链表2所有的元素均输出无论是否在重复数字【输入描述】输入为两行第一行表示第一个链表数据以“-1”结尾表示输入完毕第二行表示第二个链表数据以“-1”结尾表示输入完毕【输出描述】输出合并后的链表【样例输入】-2 0 1 4 5 -1-3 -2 0 3 6 -1【样例输出】第一个链表-2 - 0 - 1 - 4 - 5第二个链表-3 - -2 - 0 - 3 - 6合并后链表: -3 - -2 - -2 - 0 - 0 - 1 - 3 - 4 - 5 - 6#includeiostreamusingnamespacestd;// 定义链表节点结构体structNode{intdata;Node*next;Node(intval):data(val),next(nullptr){}};// 合并两个有序链表的函数保持升序Node*mergeTwoLists(Node*l1,Node*l2){Nodedummy(0);Node*taildummy;while(l1l2){if(l1-datal2-data){tail-nextl1;l1l1-next;}else{tail-nextl2;l2l2-next;}tailtail-next;}tail-nextl1?l1:l2;returndummy.next;}// 打印链表voidprintList(Node*head){Node*phead;while(p){coutp-data;if(p-next)cout - ;pp-next;}coutendl;}// 手动输入创建链表以-1结束Node*createLinkedList(){Node*headnullptr;Node*tailnullptr;intval;//输入链表元素输入-1结束while(true){cinval;if(val-1)break;Node*newNodenewNode(val);if(!head){headtailnewNode;}else{tail-nextnewNode;tailnewNode;}}returnhead;}intmain(){//创建第一个有序链表Node*l1createLinkedList();//创建第二个有序链表Node*l2createLinkedList();cout第一个链表;printList(l1);cout第二个链表;printList(l2);Node*mergedmergeTwoLists(l1,l2);cout合并后链表: ;printList(merged);return0;}/* 【输入用例2】 0 1 4 5 -1 -3 -2 0 -1 【输出用例2】 第一个链表0 - 1 - 4 - 5 第二个链表-3 - -2 - 0 合并后链表: -3 - -2 - 0 - 0 - 1 - 4 - 5 【输入用例3】 1 2 3 4 -1 -3 -2 0 1 -1 【输出用例3】 第一个链表1 - 2 - 3 - 4 第二个链表-3 - -2 - 0 - 1 合并后链表: -3 - -2 - 0 - 1 - 1 - 2 - 3 - 4 【输入用例4】 9 9 9 9 9 -1 0 0 0 0 0 -1 【输出用例4】 第一个链表9 - 9 - 9 - 9 - 9 第二个链表0 - 0 - 0 - 0 - 0 合并后链表: 0 - 0 - 0 - 0 - 0 - 9 - 9 - 9 - 9 - 9 【输入用例5】 10 20 30 40 -1 -9 -9 -9 -9 -1 【输出用例5】 第一个链表10 - 20 - 30 - 40 第二个链表-9 - -9 - -9 - -9 合并后链表: -9 - -9 - -9 - -9 - 10 - 20 - 30 - 40 【输入用例6】 -5 -1 0 -1 【输出用例6】 第一个链表-5 第二个链表0 合并后链表: -5 - 0 */链表是否有环【描述】链表是否有环的含义是指链表中是否存在一个节点其next指针指向链表中之前的某个节点从而形成闭合的循环结构。这种情况会导致遍历链表时进入无限循环无法正常终止。现在要求你设计一个程序判断输入的链表数据是否有环。【输入描述】输入为两行第一行表示链表数据以“-1”结尾表示输出完毕第二行表示输入环入口位置从0开始-1表示无环【输出描述】输出链表的检测结果是否有环以及环的位置【样例输入1】1 2 3 4 5 6 7-11【样例输出1】链表检测结果: 有环环入口在位置 1【样例输入2】2 5 6 7 8 -16【样例输出2】链表检测结果: 无环#includeiostream#includevectorusingnamespacestd;// 定义链表节点结构体structListNode{intval;// 节点存储的值ListNode*next;// 指向下一个节点的指针ListNode(intx):val(x),next(nullptr){}// 构造函数};// 判断链表是否有环的核心函数快慢指针法boolhasCycle(ListNode*head){if(!head||!head-next)returnfalse;// 空链表或单节点无环ListNode*slowhead;// 慢指针每次移动一步ListNode*fasthead;// 快指针每次移动两步while(fastfast-next){// 快指针需至少两步移动空间slowslow-next;// 慢指针移动一步fastfast-next-next;// 快指针移动两步if(slowfast)returntrue;// 相遇则存在环}returnfalse;// 快指针到末尾则无环}// 手动输入创建链表带环检测pairListNode*,intcreateLinkedList(){vectorintelements;// 存储链表元素intval;// 输入链表元素输入-1结束while(cinval){if(val-1)break;elements.push_back(val);}// 创建链表ListNode*headnullptr;ListNode*tailnullptr;for(intnum:elements){ListNode*newNodenewListNode(num);if(!head){headtailnewNode;// 首节点初始化}else{tail-nextnewNode;// 尾插法连接节点tailnewNode;}}// 处理环结构intpos;cinpos;// 输入环入口位置从0开始-1表示无环if(pos0poselements.size()){ListNode*cycleNodehead;for(inti0;ipos;i)cycleNodecycleNode-next;// 定位环入口节点tail-nextcycleNode;// 尾节点指向环入口形成环return{head,pos};// 返回链表头和环入口位置}return{head,-1};// 无环}intmain(){// 创建第一个链表并检测环auto[list1,pos1]createLinkedList();cout链表检测结果: (hasCycle(list1)?有环:无环)(pos1!-1?环入口在位置 to_string(pos1):)endl;return0;}/* 【输入用例2】 -1 -1 【输出用例2】 链表检测结果: 无环 【输入用例3】 5 -1 【输出用例3】 链表检测结果: 无环 【输入用例4】 7 -1 0 【输出用例4】 链表检测结果: 有环环入口在位置 0 【输入用例5】 1 2 3 4 5 -1 -1 【输出用例5】 链表检测结果: 无环 【输入用例6】 3 5 7 9 2 -1 2 【输出用例6】 链表检测结果: 有环环入口在位置 2 */链表的插入操作【描述】小张同学最近刚学完链表相关知识他想设计一个程序能够根据情况往链表中插入元素比如链表头、中间或者链表尾。现在请你帮助他完成这个作品。【输入描述】输入为两行第一行为a,b两个数字其中a数字表示需要插入的位置b数字表示插入的值第二行输入链表数据以“-1”结尾表示输入完毕如果插入的位置超过链表长度则执行在尾部插入。【输出描述】输出插入后的链表数据【样例输入1】0 31 2 3 4 5 -1【样例输出1】插入位置0后: 3 - 1 - 2 - 3 - 4 - 5【样例输入2】6 31 2 3 4 5 -1【样例输出2】插入位置超出链表长度执行尾部插入插入位置6后: 1 - 2 - 3 - 4 - 5 - 3#includeiostream#includevectorusingnamespacestd;// 定义链表节点结构体structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};// 在指定位置插入节点的函数保持原逻辑ListNode*insertNode(ListNode*head,intindex,intvalue){ListNode*newNodenewListNode(value);if(index0){newNode-nexthead;returnnewNode;}ListNode*currenthead;for(inti0;iindex-1current!nullptr;i){currentcurrent-next;}if(currentnullptr){cout插入位置超出链表长度执行尾部插入endl;currenthead;while(current-next!nullptr){currentcurrent-next;}current-nextnewNode;}else{newNode-nextcurrent-next;current-nextnewNode;}returnhead;}// 手动输入创建链表带环检测ListNode*createLinkedList(){vectorintelements;intval;//输入链表元素输入-1结束while(cinval){if(val-1)break;elements.push_back(val);}// 创建链表ListNode*headnullptr;ListNode*tailnullptr;for(intnum:elements){ListNode*newNodenewListNode(num);if(!head){headtailnewNode;}else{tail-nextnewNode;tailnewNode;}}returnhead;}// 打印链表voidprintList(ListNode*head){ListNode*currenthead;while(current!nullptr){coutcurrent-val;if(current-next!nullptr)cout - ;currentcurrent-next;}}intmain(){inta,b;//a表示插入的cinab;// 手动输入创建链表ListNode*headcreateLinkedList();headinsertNode(head,a,b);// 插入操作cout插入位置a后: ;printList(head);return0;}/* 【输入用例2】 3 6 0 0 0 0 0 0 -1 【输出用例2】 插入位置3后: 0 - 0 - 0 - 6 - 0 - 0 - 0 【输入用例3】 0 99 1 2 -2 -3 -1 【输出用例3】 插入位置0后: 99 - 1 - 2 - -2 - -3 【输入用例4】 7 0 0 1 -3 9 -25 65 -1 【输出用例4】 插入位置超出链表长度执行尾部插入 插入位置7后: 0 - 1 - -3 - 9 - -25 - 65 - 0 【输入用例5】 0 1 -1 【输出用例5】 插入位置0后: 1 【输入用例6】 5 5 0 1 2 3 4 -1 【输出用例6】 插入位置5后: 0 - 1 - 2 - 3 - 4 - 5 */