算法体系结构第十课

一、返回可能成环的两条单链表如果相交的第一个结点
分为三种情况讨论:
1.都无环
全都遍历到最后,如果俩结点是一样的,必相交,长链表先走两链表长度差值步,再一起走到相等的结点即可

2.一个有环一个无环
必不可能相交,所以直接返回空;

3.都有环
要么有环不相交,要么相交后成环,要么双马尾;

返回入环结点:
快慢指针法,快指针指到空时无环,返回空,
快慢指针相遇后,从该位置和头结点开始一步一步走,相遇时即是入环结点;

coding:
1.主函数:获取两个链表的入环结点,都为空即都无环,都不为空即都有环,进入相对应的函数,否则就是异或有环,直接返回空;

2.无环函数:遍历俩链表同时让一个值进行自加自减,如果末尾结点不相等,返回空,根据该值的正负进行长短链表的判定,根据该值的绝对值进行长链表的先走,走完后两链表同时走,相等时停下来

3.有环函数:(传入各自的头结点和入环结点)
如果入环结点相等,则以各自的入环结点为尾结点按照无环函数思路进行编写;
如果入环结点不相等,则拿一个入环结点进行环内的循环,如果循环到自己还没有遇到第二入环结点,则不相交,如果遇到了就返回第一入环结点;

注意:对于有环单链表,创建单链表时,当最后一个结点指回链表中已创建的结点试图形成环时,其实并不是
指向了该已创建好的结点,而是创建了新的结点并指向该新结点,并以该新结点创建出了一个新的环;
而对于两条单链表不成环的相交则不会创建新的结点

请添加图片描述

关键词:返回入环结点 无环函数 有环函数

二、二叉树遍历
1.递归版前中后序遍历
写不出来就进电子厂!

2.非递归版前序遍历
准备个栈,头结点压入,栈不空时,弹出结点,先右后左加进去;

3.非递归版中序遍历
(1)步骤:
A.当前节点cur的所有左边的结点挨个压栈,
B.弹出一个结点打印,cur指向它的右孩子,
C.栈不为空或cur不为空时重复

4.非递归版后序遍历
准备两个栈,头弹出来,先压左,再压右(头右左的顺序弹出),弹出后压入第二个栈,压完后再弹出,最后的顺序便是左右头;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dgytjhe/article/details/120139451