【剑指offer 15&16&17&37】单链表操作的所有知识点与代码【2】

本文深入解析了链表数据结构的高级操作,包括寻找倒数第k个结点、链表反转、合并排序链表及查找公共结点等。通过实际代码示例,详细讲解了各种算法的实现原理及注意事项,特别强调了代码的鲁棒性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

…7、8、9主要考虑代码的鲁棒性问题…

7、剑指offer15:链表中倒数第k个结点
原理:倒数第K个结点就是从头结点开始的第n-k+1个结点,为了实现一次遍历就找到倒数第k个结点:定义两个指针,第一个指针从头指针先走K-1步,第二个指针不动;从第k补开始,第二个指针也开始从头指针遍历,两个指针一起走,当第一个指针走到尾结点时,第二个指针的位置则为n-k+1,正好为倒数第k个结点。
此代码注意三种情况(考查代码的鲁棒性)
(1)输入的pHead为空指针时;
(2)输入的参数k为0时,k-1不是-1,而是0XFFFFF…;
(3)输入的以pHead为头结点的链表的结点总数小于K。

ListNode* Findkth(ListNode* pHead,unsigned int k)
{
	if(pHead==NULL||k==0)
	{
		cout<<"error,return NULL!"<<endl;
		return NULL;          //情况(1)和(2)
	}

	ListNode* pAhead=pHead;
	ListNode* pBehind=NULL;

	for(int i=1;i<k;i++)
	{
		if(pAhead->m_pnext!=NULL)
			pAhead=pAhead->m_pnext;
		else
		{
			cout<<"error,return NULL!"<<endl;
			return NULL;          //情况(3)
		}
	}


	pBehind=pHead;
	while(pAhead->m_pnext!=NULL)
	{
		pAhead=pAhead->m_pnext;
		pBehind=pBehind->m_pnext;
	}
	return pBehind;
}

8、剑指offer16:反转链表,整个链表反转

ListNode* ReverList(ListNode* pHead)
{
	ListNode* pre=NULL;
	ListNode* pNode=pHead;
	ListNode* pReverHead=NULL;//反转后链表的头结点

	while(pNode!=NULL)
	{
		ListNode* pNext=pNode->m_pnext;
		if(pNext==NULL)
			pReverHead=pNode;
		pNode->m_pnext=pre;

		pre=pNode;
		pNode=pNext;
	}

	return pReverHead;
	
}

***8.1、反转链表,(从m到n)*** 亲测可用
https://blog.youkuaiyun.com/Alpaca12/article/details/51508916

9、剑指offer17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

ListNode* Merge(ListNode* pHead1,ListNode* pHead2)
{
	if(pHead2=NULL)
		return pHead1;
	else if(pHead1=NULL)
		return pHead2;
	ListNode* pMergeHead=NULL;
	if(pHead1->m_value<pHead2->m_value)
	{
		pMergeHead=pHead1;
		pMergeHead->m_pnext=Merge(pHead1->m_pnext,pHead2);
	}
	else
	{
		pMergeHead=pHead2;
		pMergeHead->m_pnext=Merge(pHead1,pHead2->m_pnext);
	}
	return pMergeHead;
}

…7、8、9主要考虑代码的鲁棒性问题…

10、剑指offer37:找出两个链表的第一个公共结点
原理:如果两个链表有公共结点,则呈现出“Y”型结构,我们采用的方法是:首先遍历两个链表得到他们的长度,就能知道哪个链表比较长,并且知道长的链表比短的链表多几个结点,假设s个结点;在第二次遍历的时候,在较长的链表上先走s步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是他们的第一个公共结点。
该方法的时间效率为O(m+n)l;m和n分别为两个链表的长度
https://blog.youkuaiyun.com/xiaxzhou/article/details/74356743

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值