我正在学习链表和双链表。
我尝试使用上一个节点和下一个节点构建一个双链表,但是当我向程序调试时,"指针"不会在他们应该去的地方相互联系。在程序运行结束时,打印出来的唯一结果是我想要进入列表的最后一个值,这是值列表中的唯一值。
这是我的代码,我相信它应该正好适用于前一个'并且' next'节点不会相互连接。
Node<T> start;
Node<T> end;
public void AddFirst(T dataToAdd)
{
Node<T> tmp = new Node<T>(dataToAdd);
if (start == null)
{
start = tmp;
end = start;
}
tmp.next = start.previous;
end.next = tmp.previous;
start = tmp;
if (start.next == null)
{
end = start;
}
}
public void AddLast(T dataToAdd)
{
Node<T> tmp = new Node<T>(dataToAdd);
if (start == null)
{
AddFirst(dataToAdd);
}
tmp.next = start.previous;
end.next = tmp.previous;
end = tmp;
}
public T RemoveFirst()
{
if (start == null) return default(T);
T saveVal = start.data;
end.next = start.next.previous;
start = start.next;
if (start == null) end = null;
return saveVal;
}
public T RemoveLast()
{
if (start == null) return default(T);
T saveVal = end.data;
end.previous.next = start.previous;
end = end.previous;
if (start == null) end = null;
return saveVal;
}
public void PrintAll()
{
Node<T> tmp = start;
while (tmp != null)
{
Console.WriteLine(tmp.data);
tmp = tmp.next;
}
}
class Node<T>
{
public T data;
public Node<T> next;
public Node<T> previous;
//etc
public Node(T newData)
{
data = newData;
next = null;
previous = null;
}
}
}
答案 0 :(得分:1)
几乎所有方法都存在很少的连接问题。我修改了它,它工作正常。
public class DoubleLinkedList <T>
{
Node<T> start;
Node<T> end;
public void AddFirst(T dataToAdd)
{
Node<T> tmp = new Node<T>(dataToAdd);
if (start == null)
{
start = tmp;
end = start;
return;
}
start.previous = tmp;
tmp.next = start;
start = tmp;
if (start.next == null)
{
end = start;
}
}
public void AddLast(T dataToAdd)
{
if (start == null)
{
AddFirst(dataToAdd);
return;
}
Node<T> tmp = new Node<T>(dataToAdd);
end.next = tmp;
tmp.previous = end;
end = tmp;
}
public T RemoveFirst()
{
if (start == null) return default(T);
T saveVal = start.data;
start = start.next;
start.previous = null;
if (start == null) end = null;
return saveVal;
}
public T RemoveLast()
{
if (start == null) return default(T);
T saveVal = end.data;
end = end.previous;
end.next = null;
if (start == null) end = null;
return saveVal;
}
public void PrintAll()
{
Node<T> tmp = start;
while (tmp != null)
{
Console.WriteLine(tmp.data.ToString());
tmp = tmp.next;
}
}
}