【数据结构】链表OJ面试题2(题库+解析)

1.前言

前五题在这http://t.csdnimg.cn/UeggB

休息一天,今天继续刷题!

2.OJ题目训练

1. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网

思路

既然涉及到链表分割并且原本的数据的顺序不能改变,那我们就要用到两个新的链表来存放值,一边存放小于x的,右边按顺序存放大于x的,最后再将两个链表连起来形成新的链表,就可以完成此题。

整个链表,红色底线为小于3的值,大于为绿色底线

遍历整个表将小于x的值放入ghead中,同时更新gtail的值。

再将大于等于x的值放入Lhead表中,更新Ltail的值

最后再通过gtail(前表尾节点)和Lhead(后表头节点)相连。返回ghead既为合并的表。

注意要点

  1. 涉及到改变头节点的方法,应该添加标兵节点,这样若其中一个表为空,也不会报错
  2. 比x小的值在比x大的值后面的情况,那他就会指回L表,造成回环(假设第二个1本来是在4的后面,所以4的next节点还是指向1)

  3. 释放标兵节点

附源代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstdlib>
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// write code herestruct ListNode *ghead,*gtail,*Lhead,*Ltail;ghead = gtail = (struct ListNode *) malloc(sizeof(struct ListNode));Lhead = Ltail = (struct ListNode *) malloc(sizeof(struct ListNode));struct ListNode *cur = pHead;while(cur){if(cur->val<x){Ltail->next = cur;cur = cur->next;Ltail=Ltail->next;}else {gtail->next = cur;cur = cur->next;gtail=gtail->next;               }}Ltail->next = ghead->next;struct ListNode * a = Lhead->next;gtail->next = NULL; //防止比x大的最后一个值下一个节点指向其他的值(比x小的值在他后面的情况,那他就会指回L表,造成回环)free(Lhead);free(ghead);return a;}
};

2. 链表的回文结构。

首先科普一下回文

可以形象的理解为:正态分布就为回文,反之不是。

方法

由于回文的基本特性我们可以,将回文分成一半一半的两部分,然后进行比较

分成红底进行比较,但是由于链表的特殊性,我们不能倒着比较。

所以就要对另一半进行逆序来比较

逆序后进行比较。

这样我们就可以用到我们之前题目的积累,正所谓功夫不负有心人,CV大法启动!

附上链接:

2. 反转一个单链表。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

注意要点

  1. 中间节点要记录好,因为后续比较要用到
  2. 该如何判断比较的继续条件(任何一个为NULL就结束)

附源代码:

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:struct ListNode* middleNode(struct ListNode* head) {struct ListNode* tail = head;while(tail->next){head=head->next;tail=tail->next;if(tail->next==NULL){//head=head->next;}elsetail=tail->next;}return head;}struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* cur=head;struct ListNode* newhead = NULL;while(cur){struct ListNode* next=cur->next;cur->next = newhead;    //指向新节点newhead = cur;cur = next;} return newhead;
}bool chkPalindrome(ListNode* A) {struct ListNode* mid = middleNode(A);struct ListNode* rev = reverseList(mid);while(A&&rev){if(A->val!=rev->val){return false;}A=A->next;rev=rev->next;}return true;
}
};

3. 输入两个链表,找出它们的第一个公共结点。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

方法

大家要注意相交的链表的意思是后面的节点会交汇,而不是交叉相交

根据这种链表的特点,我们可以清楚他们的尾节点一定是相等的

通过这点我们就可以对是否为此类的链表进行判断。

再者我们发现,如果是两个链表,按照“顺序”,第一个相等的就是相交节点

那么我们要怎么让两个节点的比较值相对整个表是一样的,因为有长短不一的表

如果从首节点开始相互比较,那他们永远都不会相等,所以我们要做到同步比较

通过计算两表的长度,让较长的表提前向前走差值步,再进行比较,当第一次比较相等时,那就是相交节点!

注意要点

  1. 在遍历尾节点时,可以顺便计算链表长度
  2. 对于长表的定义,我们可以用指针替代,然后再用各自对应的长度比较,再进行长表指针的定义,这样就可以节省掉很多if else语句。

附源代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *curA=headA;struct ListNode *curB=headB;int lenA=1,lenB=1;  //链表的长度至少为1while(curA->next)   //计算链表A的长度及尾节点{lenA++; //顺便计算表长curA=curA->next;}while(curB->next){lenB++;curB=curB->next;}if(curA!=curB){return NULL;    //两边的为节点不相同,那根本不是相交链表}int gap=abs(lenA-lenB); //abs为取绝对值struct ListNode *longlist=headA;    //假设A为长节点,这里我们利用替身来表示长表struct ListNode *shortlist=headB;   //就可以节省很多判断语句if(lenB>lenA)                       //若B长,侧替换{longlist=headB;shortlist=headA;}while(gap--){longlist=longlist->next;    //先走差值步}while(longlist!=shortlist)  //不等于则同时向前遍历,直到相等{longlist=longlist->next;shortlist=shortlist->next;}return longlist;    //返回第一个相等值
}

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

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

相关文章

Acwing第 141 场周赛

A题 签到模拟即可 B题 单独考虑每一个a[i]&#xff0c;如果i要是答案需要指针移动多少次&#xff0c;然后算完&#xff0c;排个序&#xff0c;指针移动最少的就是答案。 #include <bits/stdc.h> #define int long long #define rep(i,a,b) for(int i (a); i < (…

【QT+QGIS跨平台编译】之二十二:【FontConfig+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、FontConfig介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、FontConfig介绍 FontConfig 是一个用于配置和定制字体的库&#xff0c;广泛应用于基于X Window系统的操作系统中&#xff0c;尤其是在Linux和Unix-like系统中。它为应用程序提供了一种统一的…

车载测试Vector工具——基于DoIP的ECU/车辆的连接故障排除

车载测试Vector工具——基于DoIP的ECU/车辆的连接故障排除 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和…

【周总结】Programmer‘s weekend routine---First week of February

总结 工作&#xff1a; 参加项目重构方案讨论会议、个人任务计划分期以及工期安排、项目初步重构开发 日常&#xff1a;参加年会&#xff08;阳光普照奖都莫得&#xff09; 2024.2.3 阴 不冷 连着一周的雨&#xff0c;我那袜子挂两三天了还能挤出水。。离谱、莆…

MySQL全表扫描:性能杀手的隐患与优化策略

MySQL全表扫描&#xff1a;性能杀手的隐患与优化策略 MySQL数据库作为常用的关系型数据库管理系统之一&#xff0c;全表扫描问题一直困扰着开发者。本文将深入剖析MySQL全表扫描的原理、其对性能的严重影响&#xff0c;同时提供一系列优化策略&#xff0c;助您高效应对MySQL性能…

2.3作业

一&#xff0e;选择题 1、适宜采用inline定义函数情况是&#xff08;C&#xff09; A. 函数体含有循环语句 B. 函数体含有递归语句 C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句后&#xff0c;i和j的值分别…

TQ15EG开发板教程:开发板资源介绍

时钟资源 采用时钟芯片CDCM6208提供系统时钟 PL端时钟 PS 收发器时钟 PL收发器时钟 电源 BANK500 BANK501 BANK502 BANK503(专用) 1.8V 1.8V 1.8V 1.8V PS端外设 QSPI 采用2片MT25QU256 拼接成8bit的QSPI存储系统。采用1.8V供电 SD卡 SATA接口 PS端以太网接口 D…

字符数组的学习

前言&#xff1a; 在前面我们介绍过字符型数据是以字符的ASCII码储存在存储单元中&#xff0c;一般占一个字节&#xff0c;由于 ASCII码也属于整数类型&#xff0c;因此在C99标准中把字符类型归纳为整数类型中的一种&#xff0c;由于字符数据 的应用比较广泛&#xff0c;尤其…

演讲回顾:如何为大规模研发团队加速CI构建,实现高效流水线

近日&#xff0c;龙智联合Atlassian举办的DevSecOps研讨会年终专场”趋势展望与实战探讨&#xff1a;如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队&#xff0c;以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲&#xff0…

【高阶数据结构】红黑树

文章目录 前言什么是红黑树红黑树的性质红黑树结点的定义红黑树的插入情况一情况二情况三插入代码总结 验证是否为红黑树红黑树的删除 前言 前面我们学习了 AVL 树——高度平衡的二叉搜索树&#xff0c;AVL 树保证了结点的左右子树的高度差的绝对值不超过 1&#xff0c;也就是…

bash脚本学习笔记

一、扫盲 脚本文件是一种文本文件&#xff0c;其中包含了一系列的命令和指令&#xff0c;可以被操作系统解释器直接解释执行。脚本文件通常被用来完成特定的任务或执行重复性的操作。 脚本文件通常以某种编程语言的语法编写&#xff0c;例如 Bash、Python、Perl、Ruby 等等。…

png,jpg,bmp等格式图像转.npy文件(附代码)

目录 一、npy文件二、代码三、转后效果 一、npy文件 .npy 文件是 NumPy 库用于存储数组的二进制文件格式。这种文件可以存储一个或多个 NumPy 数组对象。.npy 文件在保存和加载 NumPy 数组时非常有用&#xff0c;因为它们可以用于在磁盘上高效地存储数据&#xff0c;并且在加载…