c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题

1、单链表逆序

思路图

在这里插入图片描述

代码实现

//著: 链表结构里记得加 friend void ReverseLink(Clink& link);
void ReverseLink(Clink& link)
{
	Node* p = link.head_->next_;
	while( p == nullptr)
	{
		return;
	}
	Node* q = p->next_;

	link.head_->next_ = nullptr;

	while(p != nullptr)
	{
		Node* q = p->next_;

		//p指针指向的节点进行头插
		p->next_ = link.head_->next_;
		link.head_->next_ = p;

		p = q;
	}

	/*
	Node* p = link.head_->next_;
	if( p == nullptr)
	{
		return;
	}
	Node* q = p->next_;

	link.head_->next_ = nullptr;

	while( q != nullptr)
	{
		link.head_->data_ = p->data_;
		p->next_ = link.head_;
		link.head_ = p;
		p = q;
		q = p->next_;
	}
	link.head_->data_ = p->data_;
	p->next_ = link.head_;
	link.head_ = p;
	p = nullptr;
	*/
}

测试

int main()
{
	Clink link;
	Clink link2;
	srand(time(0));
	for(int i = 0; i<10; i++)
	{
		int val = rand() % 100;
		link.InsertTail(val);
	}

	link.show();
	cout << endl;

	ReverseLink(link);
	ReverseLink(link2);

	link.show();
	cout << endl;
	link2.show();
	cout << endl;
}

运行结果

在这里插入图片描述

2、单链表倒数第k个节点

思路图

双指针同步位移,两个指针相聚k个节点
在这里插入图片描述

代码实现

//求倒数第k个节点的值
bool MyGetLastKNode(Clink& link,int k,int& val)
{
	if(k<1)
	{
		return 0;
	}

	Node* p = link.head_;
	if( p == nullptr)
	{
		return false;
	}
	Node* pre = link.head_;

	for(int i = 0; i < k ; i++)
	{
		pre = pre->next_;

		if( pre == nullptr )
		{
			return false;
		}
	}
	//p在头节点,pre在正数第k个节点
	while( pre != nullptr )
	{
		p = p->next_;
		pre = pre->next_;
	}

	val = p->data_;
	return true;
}

代码测试

int main()
{
	Clink link;
	Clink link2;
	srand(time(0));
	for(int i = 0; i<10; i++)
	{
		int val = rand() % 100;
		link.InsertTail(val);
	}

	link.show();
	cout << endl;

	int val=0;
	if(MyGetLastKNode(link,3,val))
	{
		cout<< "k == 3   ";
		cout<< "find  " << val<< endl;
	}
	else
	{
		cout<< "k == 3   ";
		cout<< "false" << endl;
	}
	
	if(MyGetLastKNode(link,0,val))
	{
		cout<< "k == 0   ";
		cout<< "find  " << val<< endl;
	}
	else
	{
		cout<< "k == 0   ";
		cout<< "false" << endl;
	}

	if(MyGetLastKNode(link,12,val))
	{
		cout<< "k == 12   ";
		cout<< "find  " << val<< endl;
	}
	else
	{
		cout<< "k == 12   ";
		cout<< "false" << endl;
	}

	if(MyGetLastKNode(link2,3,val))
	{
		cout<< "k2 == 3   ";
		cout<< "find  " << val<< endl;
	}
	else
	{
		cout<< "k2 == 3   ";
		cout<< "false" << endl;
	}
	

}

运行结果

在这里插入图片描述

3、并两个有序单链表

思路图

在这里插入图片描述

代码实现

//合并两个有序单链表
bool MergeLink(Clink& link1,Clink& link2)
{
	Node* p = link1.head_->next_;
	Node* q = link2.head_->next_;
	Node* last = link1.head_;
	link2.head_->next_ = nullptr;

	while(p != nullptr && q != nullptr)
	{
		if(p->data_ < q->data_)
		{
			last->next_ = p;
			p = p->next_;
			last = last->next_;
		}
		else
		{
			last->next_ = q;
			q = q->next_;
			last = last->next_;
		}
	}
	if(p != nullptr)
	{
		last->next_ = p;
	}
	else
	{
		last->next_ = q;
	}

		/*
	Node* pre = link1.head_;
	Node* p = link1.head_->next_;
	Node* q = link2.head_->next_;

	while(q != nullptr)
	{
		if(p == nullptr && q != nullptr)
		{
			pre->next_ = q;
			link2.head_->next_ = nullptr;
			return true;
		}
		else if(p->data_ <= q->data_)//这里假设从小到大
		{
			p = p->next_;
			pre = pre->next_;
		}
		else 
		{
			link2.head_->next_ = q->next_;
			pre->next_=q;
			q->next_ = p;
			pre=q;
			q = link2.head_->next_;
		}
	}
	*/

	return true;
}

运行结果

在这里插入图片描述

4、判断单链表是否存在环以及入口节点

思路图

在这里插入图片描述

代码实现

//判断单链表是否存在环以及入口节点
//这里参数为Node,方便测试
//记得 friend
bool IsLinkHasCirle(Node* head,int& val)
{
	Node* fast = head;
	Node* slow = head;

	while(fast != nullptr && fast->next_ != nullptr)
	{
		slow = slow->next_;
		fast = fast->next_->next_;

		if(slow == fast)
		{
			//快慢指针再次相遇,链表存在环
			fast = head;
			while(fast != slow)
			{
				slow = slow->next_;
				fast = fast->next_;
			}
			val = slow->data_;
			return true;
		}
	}
	return false;
}

测试

int main()
{
	Node head;

	Node n1(25),n2(61),n3(312),n4(118);

	head.next_ = &n1;
	n1.next_ = &n2;
	n2.next_ = &n3;
	n3.next_ = &n4;

	n4.next_ = &n2;

	int val;
	if(IsLinkHasCirle(&head,val))
	{
		cout<< "链表存在环,环的入口节点是: "<< val << endl;
	}

}

运行结果

在这里插入图片描述

5、判断两个链表是否相交

在这里插入图片描述

思路图

在这里插入图片描述

代码实现

//判断两个链表是否相交,如果相交,返回相交节点的值
bool IsLinkHasMerge(Node* head1,Node* head2,int &val)
{
	int cnt1 = 0,cnt2 = 0;

	Node* p = head1->next_;
	Node* q = head2->next_;

	//计算两个链表的长度
	while(p != nullptr)
	{
		p = p->next_;
		cnt1++;
	}
	while(q != nullptr)
	{
		q = q->next_;
		cnt2++;
	}

	p = head1->next_;
	q = head2->next_;

	if(cnt1 > cnt2)
	{
		//第一个链表长
		cnt1 = cnt1-cnt2;
		while(cnt1 >0)
		{
			p = p->next_;
			cnt1--;
		}
	}
	else
	{
		//第二个链表长
		cnt2 = cnt2 -cnt1;
		while(cnt2 > 0)
		{
			q = q->next_;
			cnt2--;
		}
	}

	while(p != nullptr && q != nullptr)
	{
		if(p == q)
		{
			val = p->data_;
			return true;
		}
		p = p->next_;
		q = q->next_;
	}
	return false;
}

测试代码

int main()
{
	Node head1;
	Node head2;


	Node n1(25),n2(61),n3(312),n4(118),n5(18);
	Node nn1(1),nn2(2);

	head1.next_ = &n1;
	n1.next_ = &n2;
	n2.next_ = &n3;
	n3.next_ = &n4;
	n4.next_ = &n5;

	head2.next_ = &nn1;
	nn1.next_ = &nn2;
	nn2.next_ = &n3;

	int val;
	if(IsLinkHasMerge(&head1,&head2,val))
	{
		cout<< "两个链表相交,相交的节点是: "<< val << endl;
	}

}

运行结果

在这里插入图片描述

6、删除链表倒数第N个节点

思维图

在这里插入图片描述

代码实现

//这里使用利扣刷题
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //在函数内部给链表增加一个头节点,以解决不带头节点的单链表
        //head_->next   head
        ListNode* head_ = new ListNode(0,head);

        ListNode* first = head;
        ListNode* second = head_;

        for(int i = 0; i < n; i++)
        {
             first = first->next;
        }
        while(first)
        {
            first = first->next;
            second = second->next;
        }
        second->next = second->next->next;
        ListNode* ans = head_->next;
        delete head_;
        return ans;;
    }
    
};

7、旋转链表

思路图

在这里插入图片描述

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        ListNode*p = head;
        ListNode*q = head;

        if(head == nullptr || k == 0)
        {
            return head;
        }

        int number = 0;//判断链表的长度
        for(ListNode *k = head; k != nullptr; k = k->next)
        {
            number++;
        }

        k = k%number;

        for(int i = 0; i < k; i++)
        {
            p = p->next;
        }

        while(p->next != nullptr)
        {
            q = q->next;
            p = p->next;
        }

        p->next = head;
        head = q->next;
        q->next = nullptr;

        return head;


    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java解决杨辉三角

Java解决杨辉三角 01 题目 给定一个非负整数 *numRows&#xff0c;*生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRo…

亚信安慧AntDB:编织数据丝路,缔造创新篇章

亚信安慧AntDB作为一款具备国产化升级改造经验的数据库系统&#xff0c;在15年的平稳运行中积累了丰富经验。通过持续的创新和技术进步&#xff0c;AntDB不断优化性能和功能&#xff0c;满足用户的需求&#xff0c;与国际先进数据库系统保持竞争力。 AntDB秉承着与用户和行业保…

结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(下)

Limo Pro 小车建图导航 引言 前景提要&#xff1a;我们在上文介绍了使用LIMO cobot 实现一个能够执行复杂任务的复合机器人系统的应用场景的项目&#xff0c;从以下三个方面&#xff1a;概念设计、系统架构以及关键组件。 本文主要深入项目内核的主要部分&#xff0c;同样也主要…

python自动化管理和zabbix监控网络设备(zabbix部署监控网络设备以及验证部分)

目录 前言 一、Zabbix搭建 二、FW1 三、python脚本 四、core-sw1 五、core-sw2 六、DMZ-sw1 前言 详细配置视频解析访问&#xff1a;白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 一、Zabbix搭建 sed -i s/SELINUXenforcing/SELINUXdisable/ /etc/selinux/config…

力扣——盛最多水的容器

题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;…

【论文笔记】Gemma: Open Models Based on Gemini Research and Technology

Gemma 日期: March 5, 2024 平台: CSDN, 知乎 状态: Writing Gemma: Open Models Based on Gemini Research and Technology 谷歌最近放出的Gemma模型【模型名字来源于拉丁文gemma&#xff0c;意为宝石】采用的是与先前Gemini相同的架构。这次谷歌开源了两个规模的模型&…

Golang Copy()方法学习

前言 主要是涉及到深浅拷贝相关的&#xff0c;但是在看的一个资料过程中发现他有错…并且一系列&#xff0c;复制粘贴他的&#xff0c;也都错了。 错误文章指路 很显然&#xff0c;Copy是深拷贝啊&#xff01;&#xff01;&#xff01; Copy功能 copy的代码很少&#xff0c…

MySQL基础-----SQL语句之DQL数据查询语句(上篇)

目录 前言 select基本语法 一、基础查询 1.查询多个字段 2.字段设置别名 3.去除重复记录 案例 二、条件查询 1.语法 2.条件 案例 三、聚合函数 1.聚合函数 2.语法 案例 前言 前面我们学习了DML和DDL语句&#xff0c;那么本期我们学习数据查询的语句&#xff08;DQ…

启英泰伦「离线自然说」:让照明语音交互更自然、更便捷

随着科技的不断发展&#xff0c;智能家居已经成为现代生活的一部分。其中&#xff0c;智能照明作为智能家居的重要组成部分&#xff0c;为人们带来了更加便捷、舒适的照明体验。然而&#xff0c;传统的离线语音交互技术在智能照明领域的应用一直受到词条存储量的限制&#xff0…

把握职场脉搏,明智选择赛道

选择比努力更重要。男怕入错行&#xff0c;进入IT行业的你已经成功一半了&#xff0c;但IT业也细分了诸多赛道&#xff0c;应该如何兼顾选择呢&#xff1f;在快速发展的科技行业中&#xff0c;程序员面临着众多选择。如何选择最适合自己的职业赛道&#xff0c;成为许多程序员关…

Verilog Coding Styles For Improved Simulation Efficiency论文学习记录

原文基于Verilog-XL仿真器&#xff0c;测试了以下几种方式对仿真效率的影响。 1. 使用 Case 语句而不是 if / else if 语句 八选一多路选择器 case 实现效率比 if / else if 提升 6% 。 2. 如果可以尽量不使用 begin end 语句 使用 begin end 的 ff 触发器比不使用 begin end …

校园气象站—为学校的科普教育提供有力的支持

TH-XQ3校园气象站是一种针对校园环境的气象监测设备&#xff0c;通过现场自动监测的方式&#xff0c;对雨量、风向、风速、气温、相对湿度、气压、太阳辐射、噪声等气候要素进行全天候现场监测&#xff0c;同时将监测数据及时传递给学生和校园管理人员。校园气象站的建设不仅可…

python使用zmail实现邮件发送

一&#xff1a;zmail介绍 1、Zmail的优势 自动填充大多数导致服务端拒信的头信息&#xff08;From To LocalHost之类的)将一个字典映射为email&#xff0c;构造信件就像构造字典一样简单自动寻找邮件服务商端口号地址&#xff0c;自动选择合适的协议&#xff08;经过认证的&am…

哪款立体学习灯值得买!五款热门立体学习灯测评集锦!

大路灯作为专业的照明工具&#xff0c;能够帮助我们改善光线环境、提高用眼的舒适度&#xff0c;改善用眼疲劳&#xff0c;也因此备受很多群众欢迎&#xff0c;普及率日渐上升。但大路灯市场快速发展的背后&#xff0c;也涌现了大量劣质不专业产品&#xff0c;比如网红或跨界大…

【短时交通流量预测】基于Elman神经网络

课题名称&#xff1a;基于Elman神经网络的短时交通流量预测 版本时间&#xff1a;2023-04-27 代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 模型简介&#xff1a; 城市交通路网中交通路段上某时刻的交通流量与本路段前几个时段的交通流量有关&#…

华为认证HCIA\HCIP\HCIE考试费用是多少?

华为认证有HCIA、HCIP、HCIE这三个等级的认证&#xff0c;HCIA和HCIP只考笔试&#xff0c;HCIE考笔试和实验。不同方向的认证考试科目和费用会有些不同。 HCIA笔试考试费用是200美元。 每个方向的HCIP考试科目不同&#xff0c;有的方向需要考一门&#xff0c;有的方向需要考…

CSDN的默认markdown教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Java实现手机库存管理

一、实验任务 编写一个程序&#xff0c;模拟库存管理系统。该系统主要包括系统首页、商品入库、商品显示和删除商品功能。每个功能的具体要求如下&#xff1a; 1.系统的首页&#xff1a;用于显示系统所有的操作&#xff0c;并且可以选择使用某一个功能。 2.商品入库功能&…

UE4c++ 材质功能大全(想起来就补充一个)

前言&#xff1a;才想起写一个这个文档&#xff0c;前期内容较少&#xff0c;其他内容&#xff0c;我也只会想起来加一加&#xff01; 材质功能大全 竖直百分比进度HSV To RGBRGB转灰度值AlphaComosote(Premultiplied Alpha&#xff09;预乘 转 Translucent &#xff08;sRGB与…

【linux】linux系统调用及文件IO操作

一、系统调用 1、概述 系统调用&#xff1a; 就是操作系统内核 提供给用户可以操作内核 一组函数接口。用户 借助 系统调用 操作内核。比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件&#xff0c;可以通过时钟相关的系统调用获得系统时间或设置定时…
最新文章