有关链表的题目

目录

1.环形链表的约瑟夫问题

2.链表的中间节点

3.合并两个有序链表

4.反转链表

 5.移除链表元素


1.环形链表的约瑟夫问题

环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com)

 

 思路:题目给出结构是环形链表,且题目已经定义好了环形链表的结构。

1.创建环形链表,对应数据为1~n。

2.定义一个变量i从1开始数,当i =m时就将该节点释放并重新连接链表。

3.直到单个节点成环时跳出循环,该节点的数据val即为幸存编号。 

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @param m int整型 * @return int整型*/#include <stdlib.h>
#include <stdio.h>
typedef struct ListNode ListNode;ListNode* BuyNode(int n)
{ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));newnode->val = n;newnode->next = NULL;return newnode;
}ListNode* CreatList(int n)
{ListNode* phead = BuyNode(1);ListNode* ptail = phead;for(int i = 2; i <= n; i++){ListNode* newnode = BuyNode(i);ptail->next = newnode;ptail = ptail->next;}ptail->next = phead;return ptail;
}int ysf(int n, int m ) {// write code hereListNode* prev = CreatList(n);ListNode* pcur = prev->next;int i = 1;while(pcur->next != pcur){if(i == m){prev->next = pcur->next;free(pcur);pcur = prev->next;i = 1;}else{prev = pcur;pcur = pcur->next;i++;}}return pcur->val;
}

 需要注意的是当m=1是,最后一个人就是幸存者。

2.链表的中间节点

876. 链表的中间结点 - 力扣(LeetCode)

 思路:快慢指针法,快指针一次走一步,慢指针一次走两步。

当链表节点为奇数个时,循环结束标志是fast->next == NULL;

当链表节点为偶数个时,循环结束标志是fast == NULL;

要注意循环条件的前后顺序,&&会进行短路求值,如果写成(fast->next && fast),当链表节点为偶数个时,此时fast == NULL,很明显NULL->next是错误的。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* middleNode(struct ListNode* head) {struct ListNode* fast = head;struct ListNode* slow = head;while(fast && fast->next)//注意这里短路,要注意顺序{fast = fast->next->next;slow = slow->next;}return slow;
}

3.合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode)

 思路:创建一个新链表,给定两个指针遍历两条原链表,小的插入。当有剩余的链表时,直接将剩余的全部一起尾插到新链表中,无需一个一个尾插,因为原链表是有序的。

注意:会有一个原链表为空的情况,直接返回另一个原链表。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}ListNode* plist = NULL;ListNode* ptail = NULL;while(list1 && list2){if(list1->val < list2->val){if(plist == NULL){plist = ptail = list1;list1 = list1->next;}else{ptail->next = list1;ptail = ptail->next;list1 = list1->next;}}else{if(plist == NULL){plist = ptail = list2;list2 = list2->next;}else{ptail->next = list2;ptail = ptail->next;list2 = list2->next;}}}if(list1){ptail->next = list1;}if(list2){ptail->next = list2;}return plist;
}

4.反转链表

206. 反转链表 - 力扣(LeetCode)

 思路:创建新链表,一个一个头插,要注意连接顺序。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode; 
struct ListNode* reverseList(struct ListNode* head) {ListNode* plist = NULL;ListNode* pcur = head;while(pcur){if(plist == NULL){plist = head;pcur = pcur->next; plist->next = NULL;}else{ListNode* temp = pcur->next;pcur->next = plist;plist = pcur;pcur = temp;}}return plist;
}

 5.移除链表元素

203. 移除链表元素 - 力扣(LeetCode)

 思路:创建一个新链表,newhead指向新链表的头节点,newtail指向当前链表的尾节点;

pcur遍历原链表,遇到val跳过,遇到非val链接到新链表。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* newhead = NULL;struct ListNode* newtail = NULL;struct ListNode* pcur = head;while(pcur){if(pcur->val != val){if(newhead == NULL){newhead = newtail = pcur;}else{newtail->next = pcur;newtail = pcur;}}pcur = pcur->next;}if(newtail){newtail->next = NULL;}return newhead;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#使用TimeSpan对象获取时间间隔

目录 一、TimeSpan基础知识 二、实例 一、TimeSpan基础知识 使用TimeSpan对象可以方便地获取两个时间段的间隔。两个时间信息相减后会得到一个TimeSpan对象&#xff0c;该TimeSpan对象代表时间间隔&#xff0c;可以通过TimeSpan对象的Days、Hours、Minutes、Seconds、Millise…

qt学习:实战 http请求获取qq的吉凶

目录 利用的api是 聚合数据 的qq号码测吉凶 编程步骤 配置ui界面 添加头文件&#xff0c;定义网络管理者和http响应槽函数 在界面的构造函数里创建管理者对象&#xff0c;关联http响应槽函数 实现按钮点击事件 实现槽函数 效果 利用的api是 聚合数据 的qq号码测吉凶 先…

Chrome单独配置代理的方法

Windows Windows上单独对Chrome设置代理&#xff0c;需要在启动时传递参数&#xff0c;具体步骤如下。 在Chrome浏览器的快捷方式上右击&#xff0c;进入属性。在 快捷方式 标签下找到 目标 项目&#xff0c;在最后添加 –proxy-server“socks5://xxx.xxx.xx.xx:xxxx” 如果要…

亚马逊测评:卖家如何操作测评,安全高效(自养号测评)

亚马逊测评的作用在于让用户更真实、清晰、快捷地了解产品以及产品的使用方法和体验。通过买家对产品的测评&#xff0c;也可以帮助厂商和卖家优化产品缺陷&#xff0c;提高用户的使用体验。这进而帮助他们获得更好的销量&#xff0c;并更深入地了解市场需求。亚马逊测评在满足…

《动手学深度学习(PyTorch版)》笔记4.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

盲盒App小程序开发:引领未来购物新潮流

随着科技的不断发展&#xff0c;我们的购物方式也在不断改变。近年来&#xff0c;盲盒购物逐渐成为了一种新型的消费模式&#xff0c;受到了广大消费者的热烈欢迎。为了满足消费者的需求&#xff0c;越来越多的企业开始涉足盲盒App的开发。本文将探讨盲盒App开发的意义、前景以…

Redis6基础知识梳理~

初识NOSQL&#xff1a; NOSQL是为了解决性能问题而产生的技术&#xff0c;在最初&#xff0c;我们都是使用单体服务器架构&#xff0c;如下所示&#xff1a; 随着用户访问量大幅度提升&#xff0c;同时产生了大量的用户数据&#xff0c;单体服务器架构面对着巨大的压力 NOSQL解…

Linux第36步_创建正点原子的TF-A工作区

创建正点原子的TF-A工作区&#xff0c;目的是想查看正点原子的设备树文件“stm32mp157d-atk.dts”和设备树头文件“stm32mp157d-atk.dtsi”&#xff0c;了解设备树是什么样子&#xff0c;为后期基于“ST公司的源码”创建自己的设备树提供参考&#xff0c;同时也是为了学习移植u…

【Java】SpringMVC路径写法

1、多级路径 ✅类路径和方法路径都可以写成多级 ✅其中&#xff0c;类路径写在方法路径前面 ✅与Servlet不同&#xff0c;SpringMVC中写不写“/”都可以 RequestMapping("/hello/t1") RestController public class HelloSpring {RequestMapping( value "world…

Java程序设计实验7 | IO流

*本文是博主对Java各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 目录 一、实验…

C语言第十弹---函数(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、函数的概念 2、库函数 2.1、标准库和头文件 2.2、库函数的使用方法 2.2.1、功能 2.2.2、头文件包含 2.2.3、实践 2.2.4、库函数文档的⼀般格式 …

c++实现常见排序算法

常见算法效率比较 冒泡排序&#xff1a;依次比较相邻数据并根据排序规则交换&#xff1b; 插入排序&#xff1a;将当前元素插入到当前元素之前的所有元素的最后一个大于/小于的位置&#xff0c;其他位置元素依次向后移动&#xff1b; 选择排序&#xff1a;对于每个位置&…