简体   繁体   English

在Java中创建我自己的LinkedList类的问题

[英]Issue creating my own LinkedList class in Java

Okay, so I'm trying to create my own LinkedList class (with generic typing) in Java but am running into problems. 好的,所以我试图在Java中创建自己的LinkedList类(具有通用类型),但遇到了问题。 I have created a LinkedListNode class which basically sets and gets the next and right pointers and also the node's key. 我创建了一个LinkedListNode类,该类基本上设置并获取下一个和右指针以及节点的密钥。 My LinkedList class code is posted below, if you compile and run you'll see it's not setting the list up as it should. 我的LinkedList类代码发布在下面,如果编译并运行,您会发现它没有按预期设置列表。 At the moment, I am trying to insert node y after node x, but my printout looks like: 目前,我正在尝试在节点x之后插入节点y,但是我的打印输出如下:

Key: 5 - prev key: 6 - next key: 6 Key: 6 - prev key: null - next key: null 键:5-上一个键:6-下一个键:6键:6-上一个键:空-下一个键:空

My code: 我的代码:

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: 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;
    }

}

What you try to implement is Double Linked List (double as you have next and previous). 您尝试实现的是双重链接列表(与下一个和上一个相同,为两倍)。

And you have a problem in your structure design, maintain the head and tail can be issue prone. 而且您的结构设计有问题,维护头部和尾部可能会容易出问题。

You should try to implement it using single element that refer to other. 您应该尝试使用引用其他元素的单个元素来实现它。

LinkedListNode<T> header = new LinkedListNode<T>(); 

header.getNext(); // head
header.getPrevious()//tail 

The example of insert 插入示例

 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. 

 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM