有问题反过来遍历双向链接列表

时间:2013-12-05 04:41:55

标签: java doubly-linked-list

我真的很难为此修复我的代码。我创建了一个双向链接列表,我试图反向遍历。

有什么想法吗?

这是我的代码:Node.java:

public class Node {
String data;
Node next;


public Node(String data) {
    super();
    this.data = data;
    this.next = null;
}

public String getData() {
    return data;
}

public void setData(String data) {
    this.data = data;
}

public Node getNext() {
    if (this.next != null)
        return this.next;
    else
        return null;
}

public void setNext(Node a) {
    this.next = a;
}

@Override
public String toString() {          //CHECK
    if(data== null){
        return "null";
    }
    else
        return data  + "-->";
}

}

这是第二个类“DNode.java”:

public class DNode extends Node {

Node prev;

public DNode(String data) {
    super(data);
    this.prev = null;
}

public Node getPrev() {
    return prev;
}

public void setPrev(Node prev) {
    this.prev = prev;
}

}

最后,这里是DoublyLinkedList.java :(从另一个类“Linked List”覆盖“add”和“remove”方法)

public class DoublyLinkedList扩展了LinkedList {

DNode head, tail,current; 

public DoublyLinkedList() {

    this.head = this.tail = this.current = null; 
}



public void add(DNode a) {   //CHECK
    if (this.head == null) {
        this.head = tail = current= a;
        this.head.prev = null;
    }
    else{
        //a.setPrev(this.current);
        this.current.next= a;
        a.setPrev(this.current);
        this.current = this.tail = a;
    }
}
@Override
public void remove(String removestring) { 
    this.current = head;
    this.current.prev = head;
    while (this.current.getData() != removestring) {

        if (this.current.next == null) {

            System.out.println("not found");
            return;
        } else {
            this.current.prev = this.current;
            this.current = (DNode) current.next;
        }
    }
    if (this.current == head) {

        head = (DNode) head.next;

    } else {
        this.current.prev.next = (DNode) this.current.next;

    }
}



public void printList() {
    DNode temp = this.head;
    while (temp != null) {
        System.out.println(temp);
        temp = (DNode) temp.getNext();
    }

}

    public void reverseList(){
            this.current = this.tail;
    this.current.setNext(this.current.getPrev());
    this.current.setPrev(null);
    this.current = (DNode) this.current.getNext();


    while(this.current.getPrev()!= null){
        if(this.current.getNext() == null){
            this.current.setNext((this.current).getPrev()); 
            this.current.setPrev(null);
            this.current = (DNode)this.current.getNext();
        }
        else{
            DNode tempprev = (DNode) this.current.getNext();
            this.current.setNext(this.current.getPrev()); 
            this.current.setPrev(tempprev);
            this.current = (DNode) this.current.getNext();
        }
        DNode temp2 = this.tail;
        this.head = this.tail;
        this.tail = temp2;
    }

}

我能够打印前进的列表,但是后退我会遇到无限循环。有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

好吧,我们已经有了一个前进的方法。因为这是双重关联的,我们可以逐行转换此代码,而不是移动下一个(转发)我们先前(向后)移动。我们也从尾部而不是头部开始。

这是您打印前进的旧方法:

public void printList() {
    DNode temp = this.head;
    while (temp != null) {
        System.out.println(temp);
        temp = (DNode) temp.getNext();
    }

}

这可能是您向后打印的新方法:

public void printBackwardsList() {
    DNode temp = this.tail;
    while(temp != null) {
        System.out.println(temp);
        temp = (DNode) temp.getPrev();
    }
}

注意它们几乎完全相同,除了我们为head替换了head和getPrev的getNext。

答案 1 :(得分:2)

你的班级模特似乎过于复杂。您根本不需要DNode类来完成此操作。反向打印列表的方法应该与正常打印列表的方法一样简单

public void printListReverse() {
    Node temp = this.tail;
    while (temp != null) {
        System.out.println(temp);
        temp = temp.getPrevious();
    }
}

假设您正确构建和维护列表。

答案 2 :(得分:0)

while(this.current.getPrev()!= null)

替换为

while(this.current.getPrev()!= head)