当前位置: 首页 > 知识库问答 >
问题:

反向遍历双链接列表时出现问题

马安邦
2023-03-14

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

有什么想法吗?

这是我的代码:Node。爪哇:

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

}

最后,这里是双链接列表。java:(重写另一个类“链表”中的“添加”和“删除”方法)

公共类双链接列表扩展了链接列表{

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个答案

傅元龙
2023-03-14

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

取代

而(this.current.get上()!=头)

汪思博
2023-03-14

您的类模型似乎过于复杂。要做到这一点,您根本不需要DNode类。反向打印列表的方法应该与正常打印列表的方法一样简单

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

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

隗翰海
2023-03-14

嗯,我们已经有了前进的方法。因为这是双重链接的,我们可以一行一行地转换代码,而不是移动下一个(向前),我们移动前一个(向后)。我们也从尾部开始,而不是头部。

然而,这是您以前用于向前打印的方法:

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();
    }
}

请注意,它们几乎是完全相同的,除了我们把尾巴换成了头,把getNext换成了getPrev。

 类似资料:
  • 问题内容: 如何以相反的顺序遍历链接哈希表?地图中是否有预定义的方法可以做到这一点? 我创建它如下: 问题答案: List > list = new ArrayList<>(map.entrySet()); 确实不是很漂亮,但是要花费一个条目集的副本,如果您的地图上有很多条目,则可能会出现问题。 出色的Guava库具有一个,可让您将Java 5用于每个样式循环而不是索引循环:

  • 我试图打印一个双链接列表,从tail元素开始,以first元素结束。我下面的代码就是这样做的,但出于某种原因,我也返回了被删除的项目。当我从头到尾打印列表时,它不会这样做。Idk,如果是toString导致了这个或dequed方法。我把两者都包括在内。

  • 我是C语言的新手。我正在尝试创建一个双链接列表,其中数据字段是一个结构。但是当我输出元素时,只有结构的第一个字段正确显示。 所以,我有几个问题。我是否正确声明了节点值字段?我是否正确地插入了列表末尾的节点?双向链表项的输出正确吗?我的错误在哪里,如何纠正?

  • 本文向大家介绍单链表反转 遍历法Java实现相关面试题,主要包含被问及单链表反转 遍历法Java实现时的应答技巧和注意事项,需要的朋友参考一下

  • 我正在尝试反转一个链表,我为此编写了代码。但是,当我在反转后打印列表时,输出有点不完整。 产量:120 110 100

  • 问题内容: 在双头链表中,我使用了另一个链接,该链接通过copy构造函数复制到copy 。但是,当我遍历链接列表从后端插入时,它抛出了一个空指针异常。 } 问题答案: 问题似乎出在方法上。您有条件继续前进,直到node 不为null 为止: 当while循环结束时,将指向位置。然后在下一行: 现在为null,下一行: 正在尝试访问,因此是NPE的问题。您需要通过将while循环条件更改为以下内容来