我真的很难为此修复我的代码。我创建了一个双向链接列表,我试图反向遍历。
有什么想法吗?
这是我的代码: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;
}
}
我能够打印前进的列表,但是后退我会遇到无限循环。有什么想法吗?
谢谢!
答案 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)