好的,所以我正在尝试用Java创建自己的LinkedList类(使用泛型类型),但遇到了问题。我创建了一个LinkedListNode类,它基本上设置并获取下一个和右指针以及节点的键。我的LinkedList类代码发布在下面,如果你编译并运行,你会发现它没有按照它应该设置列表。目前,我正在尝试在节点x之后插入节点y,但我的打印输出看起来像:
键:5 - 上一键:6 - 下一键:6 键:6 - 上一键:null - 下一键:null
我的代码:
public class LinkedList<T> {
private LinkedListNode<T> m_head = null;
private LinkedListNode<T> m_tail = null;
public LinkedList() {
m_head = new LinkedListNode<T>();
m_tail = new LinkedListNode<T>();
m_head.setNext(m_tail);
m_tail.setPrev(m_head);
}
public LinkedListNode<T> getHead() {
return m_head;
}
public LinkedListNode<T> getTail() {
return m_tail;
}
public void insert(LinkedListNode<T> node, LinkedListNode<T> prev_node) {
prev_node.getNext().setPrev(node);
node.setPrev(prev_node);
node.setNext(prev_node.getNext());
prev_node.setNext(node);
}
public void delete(LinkedListNode<T> node) {
}
@Override
public String toString() {
LinkedListNode<T> pointer = m_head.getNext();
String result = "";
while(pointer.getKey() != null) {
T prev_key = pointer.getPrev() == null ? null : pointer.getPrev().getKey();
T next_key = pointer.getNext() == null ? null : pointer.getNext().getKey();
result += "\nKey: " + pointer.getKey() + " - prev key: " + prev_key + " - next key: " + next_key;
pointer = pointer.getNext();
}
return result;
}
public static void main(String[] args) {
LinkedListNode<Integer> x = new LinkedListNode<Integer>(5);
LinkedListNode<Integer> y = new LinkedListNode<Integer>(6);
LinkedList<Integer> list = new LinkedList<Integer>();
list.insert(x, list.getHead());
list.insert(y, x);
System.out.println(list.toString());
}
}
LinkedListNode.java:
public class LinkedListNode<T> {
private T m_key;
private LinkedListNode<T> m_next = null;
private LinkedListNode<T> m_prev = null;
public LinkedListNode() {
}
public LinkedListNode(T key) {
m_key = key;
}
public T getKey() {
return m_key;
}
public void setKey(T key) {
m_key = key;
}
public LinkedListNode<T> getNext() {
return m_next;
}
public LinkedListNode<T> getPrev() {
return m_next;
}
public void setNext(LinkedListNode<T> node) {
m_next = node;
}
public void setPrev(LinkedListNode<T> node) {
m_prev = node;
}
}
答案 0 :(得分:0)
您尝试实施的是双重链接列表(您可以使用下一个和之前的双重列表)。
你的结构设计存在问题,保持头部和尾部容易出问题。
您应该尝试使用引用其他元素的单个元素来实现它。
LinkedListNode<T> header = new LinkedListNode<T>();
header.getNext(); // head
header.getPrevious()//tail
插入
的例子 public void insert(T element) { //We add to the begin
LinkedListNode<T> newElement = LinkedListNode<T>(element);
newElement.setNext(header); //previous begin we set to be next
newElement.setPrevious(header.getPrevious()); //previous end we set to be end.
newElement.getPrevious().setNext(newElement); //to previous end we set new begin.
newElement.getNext().setPrevious(newElement); //to previous begin we set new end.
}