猿问

双重链表实现不起作用

我有一个双重链表实现如下:


public class DoublyLinkedList<T> {

    DoublyLinkedListNode<T> head;


    public DoublyLinkedListNode<T> getHead() {

        return head;

    }


    public void setHead(DoublyLinkedListNode<T> head) {

        this.head = head;

    }


    public void addNode(DoublyLinkedListNode<T> node) {

        if(null == head) {

            head = new DoublyLinkedListNode<>(node.getData());

        }else{

            traverseAndAdd(node);

        }

    }


    private boolean traverseAndAdd(DoublyLinkedListNode<T> node) {

         boolean isAdded = false;

    DoublyLinkedListNode<T> tempHead = head;

  do{

        if(tempHead.getNext() == null) {

            head.setNext(node);

            node.setPrev(head);

            isAdded = true;

            break;

        }


         tempHead = tempHead.getNext();

    }while(null != tempHead);


    return isAdded;

    }


    @Override

    public String toString() {

        StringBuffer sb = new StringBuffer();

        while(null != head) {

            sb.append(head.getData());

            head = head.getNext();

        }


        return sb.toString();

    }


}

以下是我的DoubleLinkedListNode类:


public class DoublyLinkedListNode<T> {


    T data;

    DoublyLinkedListNode<T> prev;

    DoublyLinkedListNode<T> next;


    public DoublyLinkedListNode(T data) {

        this.data = data;

    }


    public T getData() {

        return data;

    }


    public void setData(T data) {

        this.data = data;

    }


    public DoublyLinkedListNode<T> getPrev() {

        return prev;

    }


    public void setPrev(DoublyLinkedListNode<T> prev) {

        this.prev = prev;

    }


    public DoublyLinkedListNode<T> getNext() {

        return next;

    }


    public void setNext(DoublyLinkedListNode<T> next) {

        this.next = next;

    }

}

现在,当我创建DoublyLinkedList的实例并尝试以某种方式向其添加节点时,我的头部实例变量始终为空。


即使我在addNode方法中初始化它,当我尝试添加下一个节点时,它总是空的。


如果有人知道这个实现有任何问题,有人可以告诉我。


慕的地6264312
浏览 146回答 2
2回答

慕沐林林

这有效class DoublyLinkedList <T> {&nbsp; &nbsp; DoublyLinkedListNode<T> head;&nbsp; &nbsp; public DoublyLinkedListNode<T> getHead() {&nbsp; &nbsp; &nbsp; &nbsp; return head;&nbsp; &nbsp; }&nbsp; &nbsp; public void setHead(DoublyLinkedListNode<T> head) {&nbsp; &nbsp; &nbsp; &nbsp; this.head = head;&nbsp; &nbsp; }&nbsp; &nbsp; public void addNode(DoublyLinkedListNode<T> node) {&nbsp; &nbsp; &nbsp; &nbsp; if (null == head) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; head = new DoublyLinkedListNode<>(node.getData());&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; traverseAndAdd(node);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; private boolean traverseAndAdd(DoublyLinkedListNode<T> node) {&nbsp; &nbsp; &nbsp; &nbsp; boolean isAdded = false;&nbsp; &nbsp; &nbsp; &nbsp; for (DoublyLinkedListNode<T> it = head; it != null; it = it.getNext()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(null == it.getNext()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.setNext(node);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; node.setPrev(it);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isAdded = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return isAdded;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public String toString() {&nbsp; &nbsp; &nbsp; &nbsp; StringBuffer sb = new StringBuffer();&nbsp; &nbsp; &nbsp; &nbsp; for (DoublyLinkedListNode<T> it = head; it != null; it = it.getNext()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append(it.getData() + "\n");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return sb.toString();&nbsp; &nbsp; }}class DoublyLinkedListNode <T> {&nbsp; &nbsp; T data;&nbsp; &nbsp; DoublyLinkedListNode<T> prev;&nbsp; &nbsp; DoublyLinkedListNode<T> next;&nbsp; &nbsp; public DoublyLinkedListNode(T data) {&nbsp; &nbsp; &nbsp; &nbsp; this.data = data;&nbsp; &nbsp; }&nbsp; &nbsp; public T getData() {&nbsp; &nbsp; &nbsp; &nbsp; return data;&nbsp; &nbsp; }&nbsp; &nbsp; public void setData(T data) {&nbsp; &nbsp; &nbsp; &nbsp; this.data = data;&nbsp; &nbsp; }&nbsp; &nbsp; public DoublyLinkedListNode<T> getPrev() {&nbsp; &nbsp; &nbsp; &nbsp; return prev;&nbsp; &nbsp; }&nbsp; &nbsp; public void setPrev(DoublyLinkedListNode<T> prev) {&nbsp; &nbsp; &nbsp; &nbsp; this.prev = prev;&nbsp; &nbsp; }&nbsp; &nbsp; public DoublyLinkedListNode<T> getNext() {&nbsp; &nbsp; &nbsp; &nbsp; return next;&nbsp; &nbsp; }&nbsp; &nbsp; public void setNext(DoublyLinkedListNode<T> next) {&nbsp; &nbsp; &nbsp; &nbsp; this.next = next;&nbsp; &nbsp; }}public class Main {&nbsp; &nbsp; public static void main(String []args) {&nbsp; &nbsp; &nbsp; &nbsp; DoublyLinkedList<Integer> mylist = new DoublyLinkedList<>();&nbsp; &nbsp; &nbsp; &nbsp; DoublyLinkedListNode<Integer> node1 = new DoublyLinkedListNode<>(10);&nbsp; &nbsp; &nbsp; &nbsp; DoublyLinkedListNode<Integer> node2 = new DoublyLinkedListNode<>(20);&nbsp; &nbsp; &nbsp; &nbsp; DoublyLinkedListNode<Integer> node3 = new DoublyLinkedListNode<>(30);&nbsp; &nbsp; &nbsp; &nbsp; DoublyLinkedListNode<Integer> node4 = new DoublyLinkedListNode<>(40);&nbsp; &nbsp; &nbsp; &nbsp; DoublyLinkedListNode<Integer> node5 = new DoublyLinkedListNode<>(50);&nbsp; &nbsp; &nbsp; &nbsp; DoublyLinkedListNode<Integer> node6 = new DoublyLinkedListNode<>(60);&nbsp; &nbsp; &nbsp; &nbsp; mylist.addNode(node1);&nbsp; &nbsp; &nbsp; &nbsp; mylist.addNode(node2);&nbsp; &nbsp; &nbsp; &nbsp; mylist.addNode(node3);&nbsp; &nbsp; &nbsp; &nbsp; mylist.addNode(node4);&nbsp; &nbsp; &nbsp; &nbsp; mylist.addNode(node5);&nbsp; &nbsp; &nbsp; &nbsp; mylist.addNode(node6);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(mylist.toString());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(mylist.toString());&nbsp; &nbsp; }}

波斯汪

你的 head 引用并不总是空的,它确实初始化了添加第一个节点,这是 traverseAndAdd() 方法中代码中的问题。private boolean traverseAndAdd(DoublyLinkedListNode<T> node) {&nbsp; &nbsp; boolean isAdded = false;&nbsp; &nbsp; while(null != head.getNext()) {&nbsp; &nbsp; &nbsp; &nbsp; if(head.getNext() == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //this code is unreachable&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; //why are u changing the head value&nbsp; &nbsp; &nbsp; &nbsp; head = head.getNext();&nbsp; &nbsp; }&nbsp; &nbsp; return isAdded;}因此,将函数替换为private void traverseAndAdd(DoublyLinkedListNode<T> node) {&nbsp; &nbsp; DoublyLinkedListNode<T>temp=head;&nbsp; &nbsp; while(null != temp.getNext()) {&nbsp; &nbsp; &nbsp; &nbsp; temp=temp.getNext();&nbsp; &nbsp; }&nbsp; &nbsp; temp.setNext(node);&nbsp; &nbsp; node.setPrev(temp);}另一个错误,在 toString() 方法中,您将 null 值分配给 head。head 值首先被初始化,但每次调用 String() 时都会变为 null。将方法替换为public String toString() {&nbsp; &nbsp; StringBuffer sb = new StringBuffer();&nbsp; &nbsp; DoublyLinkedListNode<T>temp=head;&nbsp; &nbsp; while(null != temp) {&nbsp; &nbsp; &nbsp; &nbsp; sb.append(temp.getData());&nbsp; &nbsp; &nbsp; &nbsp; temp = temp.getNext();&nbsp; &nbsp; }&nbsp; &nbsp; return sb.toString();}
随时随地看视频慕课网APP

相关分类

Java
我要回答