扁平化多级双向链表的思路探讨与源码
扁平化多级双向链表的题目如下图,该题属于链表类和搜索类型的题目,主要考察对于搜索方法的使用和链表结构的理解。本文的题目作者想到2种方法,分别是DFS深度优先搜索方法和迭代方法,其中DFS深度优先搜索方法使用Java进行编写,而迭代方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用DFS深度优先搜索方法的思路进行解决,首先初始化节点,然后开始遍历链表,读取当前链表的下一个节点,对下一个节点判断是否为空,如果不是就开始进行深度优先搜索,得到一个子节点搜索结果,继续搜索后一个节点是否为空,如果是就把搜索结果和节点换个位置,按此思路直到遍历结束,并返回最终结果。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
public Node flatten(Node head) {
dfsSearch(head);
return head;
}
public Node dfsSearch(Node node) {
Node cur = node;
Node lastNode = null;
while (cur != null) {
Node next = cur.next;
if (cur.child != null) {
Node childLast = dfsSearch(cur.child);
next = cur.next;
cur.next = cur.child;
cur.child.prev = cur;
if (next != null) {
childLast.next = next;
next.prev = childLast;
}
cur.child = null;
lastNode = childLast;
} else {
lastNode = cur;
}
cur = next;
}
return lastNode;
}
}
显然,我们的DFS深度优先搜索方法的效果不错,还可以用迭代方法进行解决。首先判断链表是否为空,如果是就直接返回。然后初始化一个链表,新建一个双端队列,将链表头插入到双端队列,开始遍历双端队列,取出一个队列元素并赋值初使化的链表,再判断取出的队列元素是否不为空,如果是就把下一个结果插入到队列中,按照这个思路进行遍历循环,直到遍历结束并返回结果。所以按照这个思路就可以解决,下面是Python代码:
#喷火龙与水箭龟
class Solution:
def flatten(self, head: 'Node') -> 'Node':
if head == None:
return head
dummy = Node(-1, None, None, None)
preNode = dummy
dequeList = collections.deque()
dequeList.append(head)
while dequeList:
x = dequeList.pop()
preNode.next = x
x.prev = preNode
if x.next != None:
dequeList.append(x.next)
if x.child != None:
dequeList.append(x.child)
x.child = None
preNode = x
dummy.next.prev = None
return dummy.next
从结果来说Java版本的DFS深度优先搜索方法的效率不错,而Python版本的迭代方法的速度也比较不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。