算法通关村第二关——终于学会链表

这篇具有很好参考价值的文章主要介绍了算法通关村第二关——终于学会链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LeetCode206 给我们单链表的头结点head,请你反转链表,并返回反转后的链表,如图所示:

算法通关村第二关——终于学会链表,算法,链表,数据结构

本题有两种方法,分别为建立虚拟头结点辅助反转以及直接操作链表实现反转,两种方法我将逐一分析讲解。

1.建立虚拟头结点辅助反转

首先从名字分析一下这种方法,虚拟头结点,顾名思义,我们可以建立一个虚拟的头结点指向反转后的链表的头结点,那么,我们每次只需要将旧链表中的一个结点“拆下来”,让它指向虚拟头结点指向的结点,而虚拟头结点则指向该结点,这就实现了一次调整,多次调整,直到旧链表为空,即链表反转成功。

算法通关村第二关——终于学会链表,算法,链表,数据结构

这个方法的最主要思想就是“拆” “拆”“拆”,从图上可以直观的看到,每一步的操作就是将待处理链表的头结点拆下来,并将该结点指向虚拟头结点所指向的结点,而虚拟头结点则指向该结点,大家认真理解这幅图,这个方法就可以完全掌握了,代码如下:

struct Listnode* reverseList(Listnode* head)
{
	Listnode* ans = (Listnode*)malloc(sizeof(Listnode));//ans为虚拟头结点
	ans->val = -1;
	ans->next = NULL;
	Listnode* cur = head;//cur指针指向链表的头结点
	while (cur != NULL)
	{
		Listnode* next = cur->next;//用next指针记录下一次要操作的结点
		cur->next = ans->next;//将当前结点的下一个结点指向虚拟结点的下一个结点
		ans->next = cur;//虚拟结点指向当前结点
		cur = next;//将当前结点指向提前记录好的即将操作的结点
	}
	return ans->next;//返回虚拟结点的下一个结点,即链表的真正头结点
}

 2.直接操作链表实现反转

这种方法呢,比第一种方法难理解,但是面试中经常用到,所以大家也需要重点掌握。

算法通关村第二关——终于学会链表,算法,链表,数据结构

 从图上可以看到,共使用了三个指针,cur指向旧链表的头结点,pre指向新链表的头结点,而next则指向下一步想要操作的结点,每一步操作呢,我们需要先将下一步想要操作的结点保存下来(为什么要进行保存呢?是因为后续操作会改变cur->next,所以我们需要提前记录),之后我们需要将旧链表的头结点,即当前指向的结点指向新链表的头结点,并将新链表的头结点进行更新,cur指向提前保存的下一步操作需要操作的结点,重复以上步骤,直到旧链表为空,代码如下:

//直接操作链表实现反转
struct Listnode* reverseList(Listnode* head)
{
	Listnode* cur = head; //cur指针指向当前链表的头结点
	Listnode* pre = NULL;//pre指针指向调整好的新链表的头结点
	while (cur != NULL) //如果当前指向的结点不为空
	{
		Listnode* next = cur->next;//用next指针记录下一次要操作的结点
		cur->next = pre;//将当前结点的下一个结点指向新链表的头结点
		pre = cur;//更新新链表的头结点为当前结点
		cur = next;//将当前结点指向提前记录好的即将操作的结点
	}
	return pre;//返回新链表的头结点
}

 文章来源地址https://www.toymoban.com/news/detail-606009.html

到了这里,关于算法通关村第二关——终于学会链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村第二关——链表反转

    链表反转,就是链表原来是1-2-3-4-5,经过反转处理过后变成5-4-3-2-1 处理链表反转,有两种方式,一个是建立虚拟头结点,一个是直接操作链表反转。  这是执行的流程 最核心的两行就是 直接想我要让她反转,我现在设立了虚拟头结点,那我就要让新加进这个反转链表的结点

    2024年02月13日
    浏览(27)
  • 算法通关村第二关——单链表加一

    LeetCode369 用一个非空单链表来表示一个非负整数,然后将这个整数加一。你可以假设这个整数除了 0 本身,没有任何前导的 0.这个证书的各个数位按照 高位在链表头部、低位在链表尾部 的顺序排列。 计算是从低位开始的,而链表是从高位开始的,所以要处理就必须反转过来

    2024年02月14日
    浏览(34)
  • 算法通关村第二关——指定区间反转问题解析

    Leetcode92有这样一道题:给你单链表的头指针head和两个整数left、right,其中left=right,请你反转从位置left到位置right的链表结点,返回反转后的链表,如图所示: 这道题呢,有两种不同的解法,分别是头插法和穿针引线法,头插法就是我们前面说过的带头结点的反转,而穿针引

    2024年02月14日
    浏览(33)
  • 算法通关村第二关——K个一组反转

    前面有很多关于链表反转的知识,K个一组反转,就是让很多组节点进行翻转,本质也都是一样的。 现在的链表是 3-2-1-4-5-6-7-8 3-2-1已经进行了反转,现在要进行反转的是4-5-6 在这里首先计算出链表的长度,然后计算出要反转几组,现在定义pre为dummyNode,cur定义为head。 通过f

    2024年02月14日
    浏览(31)
  • 算法村第二关(1)——手写链表反转

    题目:Leetcode-206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 对于链表反转的问题,想起来其实非常简单。 就是从前往后,将节点一个一个采用头插法的做成一个新链表嘛,这样新链表就是旧链表的反转链表啦! 那既然这么简单,为什么还要学

    2024年02月14日
    浏览(31)
  • 算法通过村第二关-链表黄金笔记|K个一组反转

    提示:没有人天生就喜欢一种气味而讨厌另一种气味。文明的暗示而已。 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

    2024年02月14日
    浏览(29)
  • 算法通关村十二关 | 字符串前缀问题

    题目:LeetCode14,14. 最长公共前缀 - 力扣(LeetCode) 我们先看公共前缀有什么特点。 第一种方式,竖着比较,如图左边所示,选取数组中第一个字符串的位置,每前进一个就比较各个字符串,看是否相等,只有某一轮遇到不相等,则结束返回结果。 还是这张图         如

    2024年02月11日
    浏览(37)
  • 算法通关村第十二关-字符串基础题目

    思路:遍历字符串,将第i个字符和第N-i-1个字符串交换即可; 代码实现: 题目:反转字符串2 思路:每2k个一组,将其前k个字符反转,使用i+k与字符串长度n判断剩余字符串长度属于(0,k)还是 [k,2k)之间;然后按照要求剩余字符串即可; 代码实现: 题目:仅仅反转字母 思

    2024年01月22日
    浏览(38)
  • 算法通关村第十二关——字符串反转问题解析

    字符串反转是关于字符串算法里的重要问题,虽然不是太难,但需要考虑到一些边界问题。本篇文章就对几道字符串反转题目进行分析。 力扣344题,编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包