文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

五个经典链表OJ题带你进阶C++链表篇

2024-04-02 19:55

关注

反转单链表

题目1:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]

题目来源:力扣

思路一: 翻转指针方向,首先我们要有三个指针,这个就不展示代码了,逻辑过程如下:

 思路二:头插方法,我们把每个节点拿下来进行头插实现!代码实现如下:


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;
}

返回链表中间节点的位置

题目2:给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:[1,2,3,4,5,6]

输出:此列表中的结点 4 (序列化形式:[4,5,6])

由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点

题目来源:力扣

思路: 我们使用快慢指针的办法,快指针fast走两步,慢指针slow走一步,这样当fast走完了,slow指针就走到了中间的位置,但是我们要注意,如果链表节点为奇数个则当fast为NULL就应该结束循环,如果链表节点为偶数个则当fast->next为NULL则结束循环!思路解析,代码实现如下:


struct ListNode* middleNode(struct ListNode* head)
{
	struct ListNode* slow = head, * fast = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
	}
	return slow;
}

合并两个有序链表

题目3:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]

题目来源:力扣

思路:首先我们要判断两个链表是否为空,如果为空则返回另一个链表!接着我们需要定义两个指针头指针head和一个尾指针tail,接着我们比较list1->val是否大于list2->val然后进行链接链表的操作,并且当其中一个链表为空则跳出循环,我们则需要在循环外再次判断是哪个链表为空导致跳出的循环,并且最后把不为空的链表链接在后面!最后返回头指针head!

建议小伙伴们看着这个思路尝试着自己写一下,可以参考如下代码:


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
	if (list1 == NULL)
		return list2;
	if (list2 == NULL)
		return list1;
	struct ListNode* head = NULL, * tail = NULL;
	if (list1->val < list2->val)
	{
		head = tail = list1;
		list1 = list1->next;
	}
	else
	{
		head = tail = list2;
		list2 = list2->next;
	}
 
	while (list1 != NULL && list2 != NULL)
	{
		if (list1->val < list2->val)
		{
			//尾插
			tail->next = list1;
			list1 = list1->next;
		}
		else
		{
			tail->next = list2;
			list2 = list2->next;
		}
		tail = tail->next;
 
	}
	if (list1)
		tail->next = list1;
	if (list2)
		tail->next = list2;
 
	return head;
}

判断链表中是否有环

 给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1

输出:true

解释:链表中有一个环,其尾部连接到第二个节点。

题目来源:力扣

思路: 我们使用快慢指针的方法,让fast指针一次走两步,slow指针一次走一步,当链表有环的时候,当slow进入环了,fast就开始追slow,假设fast跟slow的距离为N,每走一次fast跟slow的距离就会缩小一步,也就是N-1,N-2,N-3,N-4,直到N为0 fast就追上slow了!代码实现如下:


bool hasCycle(struct ListNode *head) 
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    }
    return false;
}

判断环形链表进入的节点

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

不允许修改 链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1

输出:返回索引为 1 的链表节点

解释:链表中有一个环,其尾部连接到第二个节点。

题目来源:力扣

 思路:我们还是用跟上面一样的快慢指针的方法,但是在后面,一个指针从相遇点meet开始走,一个指针从链表头head开始走,他们会在入口点相遇!图解,代码参考见下:


bool hasCycle(struct ListNode *head) 
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    }
    return false;
}

?我们一起快乐编程不头秃!

gitee(码云):Mercury. (zzwlwp) - Gitee.com       

到此这篇关于五个经典链表OJ题带你进阶C++链表篇的文章就介绍到这了,更多相关C++ 链表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯