标签:src sdn 双向链表 复制 状态 code bubuko 节点 一个队列
转自:https://blog.csdn.net/Together_CZ/article/details/74906427
//猛一看有点晕,实际上很简单。
使用两个栈,一个是保存输入S1,另一个是输出S2;
当有新元素插入到队尾时,就将元素放入S1中;
当要删除队头元素的时候,若S2不为空,那么就弹S2的首元素;否则将S1中全部出栈压入S2中,再弹出,如果S1为空,那么就没有元素了。
那么就找到一个结点指针的下一个节点,并将元素赋值,并且删除下一个节点,并将指针指向下下一个节点。
如果是删除最后一个节点,那么就需要遍历了。
节点结构定义:
public static class ComplexListNode { int value; ComplexListNode next;//指向下一个节点 ComplexListNode sibling;//有一个指向任意节点的指针。 }
//如果是使用普通复制的话,那么需要两个遍历的指针,并且时间复杂度是O(n^2)。
假设原始状态是这样的:
第一步:在每一个节点后面加上一个复制的节点;第二步,每一个复制节点的sibling指针,就指向签一个节点的sibling节点的下一个节点,第三步,奇偶拆分。
这个并不需要赋存,而且复杂度是O(n)的!!!
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
//猛一看都懵了啊!完全不会啊!
因为二叉树中的节点包括指向左子树和右子树的指针,而且双向链表中有指向前一个节点和后一个节点的指针,那么是可以实现转化的。
只要将当前根节点的左指针指向,左子树中最大的节点;右指针指向右子树中最小的节点即可。
那么递归地去进行,先将左子树转化为双链表,将根节点地左子节点指针指向最后一个节点;然后去处理右子树,将根的右子节点指向右子树的第一个节点。
标签:src sdn 双向链表 复制 状态 code bubuko 节点 一个队列
原文地址:https://www.cnblogs.com/BlueBlueSea/p/9655877.html