最近的一次编码采访中提到了这个问题.
问:给定二叉树,编写程序将其转换为双向链表.双链表中的节点按照由Z字形级别顺序遍历形成的顺序排列
我的方法
我总是可以对树的zig-zag级别顺序进行遍历并将其存储在数组中,然后创建一个双链表.但问题需要一个就地解决方案.任何人都可以帮助解释应该使用的递归方法吗?
我正在尝试设计一个从文件中获取数据的程序,之后它为唯一数据提供编号,链表还包含父列表和子列表.
数据结构:
____A
/ |
B C
| / \
E--> F G
| | |
I J K
Run Code Online (Sandbox Code Playgroud)
节点可以具有多个下一个节点(例如A和C),并且可以具有多于一个的先前节点.
文本文件包含这样的数据,我将从文件中获取数据并将其转换为链接列表:
A
B
E
I
A
C
E
F
J
A
C
G
K
Run Code Online (Sandbox Code Playgroud)
我的问题:是否可以使用具有多个下一个或多个先前节点的节点创建链接列表,如果是这样,结构将如何显示?
我尝试过的:
我创建了一个结构,其中包含父和子的4个整数数组.
struct abcd{
char data;
int nodeid;
int parent[4];
int child[4];
struct abcd *next;
}
Run Code Online (Sandbox Code Playgroud)
因此,父数组保存最前一个节点的node-id (可以是多个,因为例如E(B&C指向它) - >(node-id-1).
子数组包含即时下一个节点(node-id +1)的node-id.
A或任何其他节点没有重复的节点.
OUTPUT:
1 : A <--
2 : B <-- 1
3 E <-- 2,5
4 …Run Code Online (Sandbox Code Playgroud) 您好,我对 Java 很陌生,在为双向链表构建嵌套 Iterator 类时遇到了这个问题。我不确定如何编写一个public E next()方法来让它迭代双向链表。
任何帮助是极大的赞赏!
private class DoubleListIterator implements Iterator<E> {
// instance variable
private Node current=head;
private Node last;
private int index=0;
public boolean hasNext() {
return index < N;
}
public E next() {
if (!hasNext()) throw new NoSuchElementException();
}
public void remove() { throw new UnsupportedOperationException(); }
}// end class ListIterator
Run Code Online (Sandbox Code Playgroud) 我试图理解双链表的java实现.我有以下代码:
public class DLLNode{
//define variables
public int info;
public DLLNode next;
public DLLNode prev;
//Passing constructors
public DLLNode(int i){
info = i;
next = prev = null;
}
public DLLNode(int i, DLLNode n, DLLNode p){
info = i;
next = n;
prev = p;
}
}
Run Code Online (Sandbox Code Playgroud)
以下内容:
public class DLL {
DLLNode head;
DLLNode tail;
public DLL(){
head = tail = null;
}
//Check whether list is empty or not
public boolean isEmpty(){
return head == null;
}
//Insert …Run Code Online (Sandbox Code Playgroud) 线性数据结构顺序遍历数据元素,其中只能直接到达一个数据元素.例如:数组,链接列表.
但是在双向链表中,我们可以使用前一个指针和下一个指针来访问两个数据元素.
那么我们可以说双链表是非线性数据结构吗?
如果我错了,请纠正我.
谢谢.
最近,我看到了这个:
struct node {
node* pNext;
node** pPrevNext;
};
void insert_before(node** pNext, node* toInsert) {
toInsert->pNext = *pNext;
toInsert->pPrevNext = pNext;
if (*pNext) (*pNext)->pPrevNext = &toInsert->pNext;
*pNext = toInsert;
};
// node *a, *b;
// insert_before(a->pPrevNext, b);
Run Code Online (Sandbox Code Playgroud)
它看起来像一个单链表,但包含指向前一个节点的下一个指针的指针.我的问题很简单:这叫什么?如果没有"真实姓名",搜索有关此数据结构的信息在StackOverflow和整个互联网上都会显示为空.
请注意,它不是双向链表,如下所示:
struct node {
node* pNext;
node* pPrev;
};
Run Code Online (Sandbox Code Playgroud) 有人建议实施吗?前几天我在家里试过这个,发现移动语义太难建立先前的链接或简单的链表.使用std :: unique_ptr创建树很容易.当然,由于复制/分配,std :: shared_ptr可以轻松实现这个问题.那怎么样?
我有一个树形结构.在这个树结构中,我将节点的孩子保持为双向链表:

(来源:双链表)
(由于创建此列表的广度优先搜索方法,我选择了此结构.)
现在我担心的是垃圾收集器是否可以自动销毁此列表.当然,我只保留对这三者的根节点的引用.Afaik GC的原理是它收集内存中的数据结构,其中没有指向任何引用.但是在双向链表中,每个节点都是从它的兄弟节点引用的,兄弟节点引用节点.因此总是会引用一个节点,GC永远不会收集它.
垃圾收集器会处理双向链表吗?
如果没有,最简单的收集方式是什么?
我知道LinkedLists是以双向链接的方式实现的,因此每个节点都有一个下一个和一个前一个指针.但是,我找不到用于访问先前节点的语法?我查看了java api,并且有一种向后迭代链表的方法.对我而言,暗示有一种简单的方法来访问先前的节点P:.
我正在尝试设计一个实验来证明LinkedLists不仅仅是一个单一链接列表,但我无法想到如何在没有在链表中向后移动的情况下这样做.
如果可能,请向我解释如何向后移动,非常感谢.
在过去的几个小时里,我一直试图通过检查我的调用堆栈来解决这个问题,但仍然没有弄清楚发生了什么!
我的序列数据库基本上从文件中收集所需的信息,然后调用我的链接列表类以使用收集的信息创建一个新节点,并将该节点放在链接列表的末尾:
标题:
#ifndef SEQUENCE_H
#define SEQUENCE_H
#include "DNA.h"
#include "DNAList.h"
class SequenceDatabase
{
public:
//Default Constructors
SequenceDatabase();
//Methods
void importEntries(string);
private:
DNAList list;
};
#endif
Run Code Online (Sandbox Code Playgroud)
来源:
#include "SequenceDatabase.h"
#include "DNA.h"
#include "DNAList.h"
#include <fstream>
using namespace std;
SequenceDatabase::SequenceDatabase() //Default Constructor.
{
DNA object;
DNAList list;
}
void SequenceDatabase::importEntries(string name)
{
DNA* item;
ifstream file;
file.open(name);
if(!file.is_open())
{
cout << "Error opening file!" << endl;
exit(1);
}
char letter;
string label, sequence;
int ID, length, index;
file >> letter;
if(letter …Run Code Online (Sandbox Code Playgroud)