你会得到一个双向链表,除了next和previous指针外,它还有一个子指针,它可能指向一个单独的双向链表列表。这些子列表可能有自己的一个或多个子列表,依此类推,从而形成一个多级数据结构,如下例所示。展平列表,使所有节点出现在单级双向链表中。您将获得列表第一级的头部。给你一个双向链表,除了下一个和上一个指针之外,它还可以有一个子指针,它可能指向也可能不指向一个单独的双向链表。这些子列表可能有自己的一个或多个子列表,依此类推,以产生多级数据结构,如下例所示。展平列表,使所有节点都出现在单级双向链表中。您将获得列表第一层的头部。例子:输入:1---2---3---4---5---6--NULL|7---8---9---10--空|11--12--NULL输出:1-2-3-7-8-11-12-9-10-4-5-6-NULL上面例子的解释:给定以下多级双向链表:我们应该returnsomethinglikethisFlatdoublelinkedlist:解题思路:本题是一个典型的DFS(深度优先搜索)类型的例题,给出了图解。只要你知道DFS,你应该马上就能想到这个idea。简单说一下这道题:深度优先搜索就像是对一棵树(二叉树)进行前序遍历,从某个顶点(链表的头节点)开始,从上到下遍历,然后遇到未访问顶点相邻点(子节点Child),继续深度优先遍历,重复上述过程(递归),直到所有顶点都被访问。其逻辑以示例输入为例:1---2---3---4---5---6--NULL|7---8---9---10--空|11---12---NULL从节点1开始遍历,当前遍历链表为:1---2---3---4---5---6--NULL遇到相邻点2,其子链表为:7---8---9---10--NULL,子链表的头节点7作为参数传递给DFS函数,当前遍历链表为:7---8---9---10---NULL继续遍历,遇到邻接点8时,其子链表为:11--12--NULL通过子链表的头节点8-链表作为参数传入DFS函数,当前遍历链表为:11--12---NULL继续遍历,没有相邻点,遍历结束,返回当前链表的尾节点12链表,改变子链表的相邻点8和头节点11的关系:7---8---11---12连接返回值尾节点12和相邻点的下一个节点9:7---8---11---12---9---10---NULL继续遍历,没有相邻点,遍历结束,返回第e当前链表的尾节点10改变邻接点2与子链表头节点7的关系:1---2---7---8---11---12---9---10--NULL连接返回值尾节点10和相邻点的下一个节点3:1---2---7---8---11---12---9---10---3---4---5---6--NULL继续遍历,没有相邻点,遍历结束,返回到当前链表的结束节点6,递归结束,返回到头节点1,链表为:1---2---7---8---11---12---9---10---3---4---5---6--NULLJava:classSolution{publicNodeflatten(Nodehead){dfs(head);返回头;}//深度优先搜索函数privateNodedfs(Nodehead){Nodecur=head;while(cur!=null){if(cur.child!=null){//改变当前节点与子节点的关系Nodenext=cur.next;//暂时记录下一个节点cur.next=cur.child;//将当前节点与子列表的头节点连接起来cur.next.prev=cur;//将子列表的头节点作为参数传递给dfs节点childLast=dfs(cur.child);//childLast获取子列表尾节点的返回值childLast.next=next;//尾子链表的节点和暂存节点Connectionif(next!=null)next.prev=childLast;//如果暂存节点不为空,则将其prev指向子链表的尾节点cur.child=null;//清空子列表cur=childLast;//刷新当前节点,跳过子列表的遍历}head=cur;//将头节点刷新为当前节点cur=cur.next;//刷新当前节点}returnhead;//返回子列表的尾节点}}Python3:class解决方案:defflatten(self,head:'Node')->'Node':self.dfs(head)returnheaddefdfs(self,head):cur=headwhilecur:ifcur.child:next=cur.下一个cur.next=cur.childcur.next.prev=curchildLast=self.dfs(cur.child)childLast.next=nextifnext:next.prev=childLastcur.child=Nonehead=curcur=cur.nextreturnhead欢迎关注微信新工公众号:爱写Bug
