我正在尝试在添加节点后打印链接列表。我有一个虚拟节点来启动列表
Object.prototype
但是当我打印时,我得到一个无限循环打印出新添加节点的数据字段。关联列表可怕......我做错了什么?
答案 0 :(得分:1)
这是因为在此之后:
while (!tmp->next) {
tmp->next = newNode; /* inserts new node into array */
tmp = newNode; /* points head to newly added node */
}
head指向newNode和newNode-> next指向newNode。
这就是问题所在。 实际上插入newNode是一个问题。你将不得不改变它。
答案 1 :(得分:1)
我假设您正在尝试将新节点添加到阵列的末尾(也就是推送)。 所以试试这个:
Socket socket = null;
InetSocketAddress addr = new InetSocketAddress(host, port);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
try
{
socket = new Socket(proxy);
socket.connect(addr, getUrlConnectTimeout());
}
catch (IOException ioe)
{
logger.info("IOE");
}
答案 2 :(得分:1)
while (tmp->next) {
tmp->next = newNode; /* inserts new node into array */
tmp = newNode; /* points head to newly added node */
}
在这个片段中,你失去了对下一个节点的参考,只是在头部附近添加了newNode。例如,您有以下列表:
[1]->[2]->[3]
你想把一个新元素推入该列表:[4],执行推送功能时会发生什么(上面的代码片段):
tmp = head; // tmp = [1]
while(tmp->next) {
tmp->next = newNode; // [1]->next = [4]
tmp = newNode; // tmp = [4]
}
因此,下次'(tmp-> gt; next)'被评估时,它将被评估为:[4] - > next并且它将为NULL,从而打破循环。您的列表将是:
[1]->[4]
其他元素丢失,因为您没有指向它们的引用,这称为内存泄漏,因为您以后无法释放它们。
你可以用这种方式编写推送功能:
tmp = head;
while(tmp->next)
tmp = tmp->next;
tmp->next = newNode // Adds new node to the tail of the linked list
答案 3 :(得分:1)
您通过以下行创建了一个封闭的圆圈链接列表:
while (!tmp->next) {
tmp->next = newNode; /* inserts new node into array */
tmp = newNode; /* points head to newly added node */
}
所以在这之后实际上你得到newNode->next = newNode
这是`tmp-> next = tmp。
所以不应该这样做,你应该这样做:
while (tmp->next) {
tmp = tmp->next; //Find the last node
}
tmp->next = newNode; //Inserts new node into the end of the array