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

news2024/12/19 13:13:49

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.coloradmin.cn/o/1488018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux常用的解压缩工具介绍

在Linux系统中&#xff0c;解压缩文件是一种常见的操作。有多种工具可以用来解压缩文件&#xff0c;它们各自有不同的特点和优势。以下是一些常用的Linux解压缩工具&#xff0c;以及它们之间的区别。 1. tar tar是一个强大的文件打包和解包工具&#xff0c;它可以用来打…

基于springboot+vue的响应式企业员工绩效考评系统(源码+论文)

文章目录 前言 一、功能设计 1 普通员工功能 2 主管功能 3 系统管理员功能 4 评分标准功能 5 PC端与手机端 6 制图 二、功能实现 普通员工 1普通员工登录 2公告板块 3日志板块 主管 1主管登录 2公告板块 3日志板块 4绩效评分板块 5个人信息板块 系统管理员…

身份证识别系统(安卓)

设计内容与要求&#xff1a; 通过手机摄像头捕获身份证信息&#xff0c;将身份证上的姓名、性别、出生年月、身份证号码保存在数据库中。1&#xff09;所开发Apps软件至少需由3-5个以上功能性界面组成。要求&#xff1a;界面美观整洁、方便应用&#xff1b;可以使用Android原生…

基于springboot+vue的校园爱心捐赠互助管理系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 随着经济水平和生活水平的提高在校大学生在校需要处理的物品也在不断增加&#xff0c;同时校园内还存在很多贫困生&#xff0c;可以通过线上平台实现资源的整合和二次利用&#xff0c;通过线上平台求助信…

c语言内存分配知识,堆,栈,全局静态,常量,代码

c语言中一些内存的作用 参考&#xff1a;https://blog.csdn.net/m0_49768044/article/details/131391832&#xff0c;其他

CSS列表属性

CSS列表属性 列表相关的属性&#xff0c;可以作用在 ul、ol、li 元素上。 代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>列表相关属性</title><style>ul {/* …

C++:类与对象(3)

创作不易&#xff0c;感谢三连 一、深入解析构造函数 如上图&#xff0c;在一般情况下&#xff0c;我们认为A类中的_a1和_a2只不过是声明&#xff0c;并没有开空间&#xff0c;而真正的空间开辟是在【定义】的时候&#xff0c;也就是我们根据这个类实例化出整个对象的时候。 …

深入分析Android运行时环境ART:原理、特点与优化策略

摘要 随着移动互联网的快速发展&#xff0c;智能手机的性能和功能日益强大&#xff0c;其中Android操作系统因其开放性和灵活性而占据主导地位。Android运行时环境&#xff08;ART&#xff09;作为执行应用程序代码的关键组件&#xff0c;在系统性能和用户体验方面起着至关重要…

【Web安全靶场】xss-labs-master 1-20

xss-labs-master 其他靶场见专栏 文章目录 xss-labs-masterlevel-1level-2level-3level-4level-5level-6level-7level-8level-9level-10level-11level-12level-13level-14level-15level-16level-17level-18level-19level-20 level-1 第一关没有进行任何限制&#xff0c;get请求…

服务器感染了.ma1x0勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 网络安全成为至关重要的议题。.ma1x0勒索病毒是当前网络威胁中的一种恶意软件&#xff0c;它的出现给用户带来了极大的困扰。然而&#xff0c;正如任何挑战一样&#xff0c;我们也有方法来面对并克服.ma1x0勒索病毒。本文将全面介绍这种病毒的特点&#xff0…

挑战杯 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…

Eclipse也可以轻松创建JSP动态Web项目 绿色、免费、神器、就是好用一大截!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

本地安装部署Flask并结合内网穿透实现远程访问本地web界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

树莓集团董事长王凯带队拜访国家超级计算成都中心,探索数字经济高质量发展新路径

随着数字经济时代全面开启&#xff0c;算力作为新型生产力&#xff0c;已成为支撑数字经济发展的“新底座”、驱动经济社会数字化转型的“新引擎”。 2024年3月1日&#xff0c;树莓科技&#xff08;成都&#xff09;集团有限公司董事长王凯、副总裁吴晓平、天府产城投资部部长…

Centos7.9双网卡绑定操作

同事整理的安装文档参考&#xff1a; 首先要有两块物理网卡 我用的虚机模拟两块物理网卡 先查看一下bonging模块有没有启动 lsmod | grep bonding 如没启动 modprobe bonding 查看两块网卡名字 创建物理网卡网口配置文件 vi /etc/sysconfig/network-scripts/if…

力扣 第 387 场周赛 解题报告 | 珂学家 | 离散化树状数组 + 模拟场

前言 整体评价 手速场模拟场&#xff0c;思路和解法都蛮直接的。 所以搞点活 如果T2&#xff0c;如果不固定左上角&#xff0c;批量查询某个点为左上角&#xff0c;求满足总和 ≤ k \le k ≤k的子矩阵个数 如果T2&#xff0c;如果不固定左上角&#xff0c;求总和 ≤ k \le k…

手写分布式配置中心(二)实现分布式配置中心的简单版本

这一篇文章比较简单&#xff0c;就是一个增删改查的服务端和一个获取配置的客户端&#xff0c;旨在搭建一个简单的配置中心架构&#xff0c;代码在 https://gitee.com/summer-cat001/config-center 服务端 服务端选择用springboot 2.7.14搭建&#xff0c;设计了4个接口/confi…

每天一道leetcode:20.有效的括号(简单;栈的经典题目)

⭐今日份题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对…

【数据结构与算法设计】上机课习题一

基础知识 勾画 1.存储结构是逻辑结构的&#xff08;&#xff09;实现 2.一个算法的时空性能是指该算法的&#xff08;&#xff09;和&#xff08;&#xff09; 3.在一般算法下一个算法的事件复杂性是&#xff08;&#xff09;的函数 4.用python设计一个算法&#xff0c;计算 …

输入文章id,爬取小红书某文章下所有评论

import requests import time import csvf open(小红书评论.csv,mode a,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[内容,点赞数量,发布时间,昵称,头像链接,用户id]) csv_writer.writeheader()def spider(url):headers {"Cookie":"abR…