gpt4 book ai didi

java - 循环双向链表 addToHead 并打印

转载 作者:行者123 更新时间:2023-12-01 10:58:51 24 4
gpt4 key购买 nike

这是我在java中的第一个作业,当我运行它时,它不断打印最后一个节点值,我不知道它是否理解它是循环的,也不知道问题出在哪里!

public class CircularDoublyLinkedList {

public static void main(String argv[]) {
CircularDoublyLinkedList List = new CircularDoublyLinkedList();
List.printList();
List.addToHead(10);
List.printList();
List.addToHead(20);
List.addToHead(30);
List.printList();

}

class Node {

Object info;
Node next, prev;

Node() {
info = null;
next = null;
prev = null;
}


Node(Object el, Node n, Node p) {
info = el;
next = n;
prev = p;
}
}

private Node head;

CircularDoublyLinkedList() {
head = null;
}

public void addToHead(Object el) {
Node tmp = new Node(el, null, null);
if (head == null) {
tmp.next = head;
tmp.prev = head;
head = tmp;
}
head.prev = tmp;
head.prev.next = tmp;
tmp.next = head;
tmp.prev = head.prev;
head = tmp;

}

public void printList() {

Node tmp = head;
if (head == null) {
System.out.print("empty\n");
return;
}
if (head.next == head) {
System.out.print(head.info + " <-> " + tmp.info + " \n ");
return;
}

System.out.print(head.info + " <-> ");
tmp = head.next;
while (tmp.next != head) {
System.out.print(tmp.info+ " <-> ");
tmp = tmp.next;
}
}

这是输出窗口:

empty
10 <-> 10
30 <-> 20 <-> 10 <-> 10 <-> 10 <-> 10 <-> 10 <-> 10 <-> 10 <-> 10 <-> 10 <-> 10 <->

问题是为什么它不打印以下内容?代码哪里出了问题?

empty
10 <-> 10
30 <-> 20 <-> 10 <-> 30

请帮忙,提前致谢:)

最佳答案

你的代码是多余的。我建议您清理它以了解它出了什么问题。

首先,我不会使用Object类型。您可以使用Java generics如果您希望您的类接受任何类型的数据,则可以使您的代码更简洁。此外,请注意 Node 是列表的一部分,因此不应与其他人“共享”。您可以将其设为 CircularLinkedList 类中的私有(private)类。

我的建议如下:

public class CircularLinkedList<T> {
private class Node<T> {
private T element;
private Node<T> next;
private Node<T> previous;

public Node(T element) {
this.element = element;
this.next = null;
this.previous = null;
}

// getters and setters
}
private Node<T> head;

public CircularLinkedList(){
head = null;
}
}

此时,在您的 CircularLinkedList 类的方法中,您必须添加将元素添加到头部的方法。尝试在一张纸上勾勒出您想要的行为,当:1)列表为空; 2)链表中只有一个节点; 3) 列表中存在多个元素。结果应如下所示:

public void addToHead(T element) {
Node<T> newNode = new Node<T>(element);
if (head == null) {
// This is the first node you are adding to the list.
head = newNode;
head.setNext(head);
head.setPrevious(head);
}
else {
// Some nodes are already present in your list.

// Going right.
newNode.setNext(head);
newNode.setPrevious(head.getPrevious());

// Going left.
newNode.getPrevious().setNext(newNode);
newNode.getNext().setPrevious(newNode);
head = newNode;
}
}

要打印列表,请使用以下命令(同样在CircularLinkedList中):

    public void printList() {
Node<T> temp = head;
do {
System.out.print(temp.getElement() + " ");
temp = temp.getNext();
} while (temp != head);
}

以相反的顺序打印列表(同样在CircularLinkedList中):

    public void printReverseList() {
Node<T> temp = head;
do {
System.out.print(temp.getElement() + " ");
temp = temp.getPrevious();
} while (temp != head);
}

如果运行以下代码:

public static void main (String[] args) {
// Notice the list declaration where T becomes an actual data type.
CircularLinkedList<Integer> list = new CircularLinkedList<Integer>();

list.addToHead(1);
list.printList();
System.out.println();
list.printReverseList();
System.out.println();

list.addToHead(2);
list.addToHead(3);
list.printList();
System.out.println();
list.printReverseList();
}

您将获得以下输出:

1 

1

3 2 1

3 1 2

尽量保持代码尽可能简洁和可读。

关于java - 循环双向链表 addToHead 并打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33461643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com