2 回答

TA貢獻2016條經驗 獲得超9個贊
這有效
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;
for (DoublyLinkedListNode<T> it = head; it != null; it = it.getNext()) {
if(null == it.getNext()) {
it.setNext(node);
node.setPrev(it);
isAdded = true;
break;
}
}
return isAdded;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
for (DoublyLinkedListNode<T> it = head; it != null; it = it.getNext()) {
sb.append(it.getData() + "\n");
}
return sb.toString();
}
}
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;
}
}
public class Main {
public static void main(String []args) {
DoublyLinkedList<Integer> mylist = new DoublyLinkedList<>();
DoublyLinkedListNode<Integer> node1 = new DoublyLinkedListNode<>(10);
DoublyLinkedListNode<Integer> node2 = new DoublyLinkedListNode<>(20);
DoublyLinkedListNode<Integer> node3 = new DoublyLinkedListNode<>(30);
DoublyLinkedListNode<Integer> node4 = new DoublyLinkedListNode<>(40);
DoublyLinkedListNode<Integer> node5 = new DoublyLinkedListNode<>(50);
DoublyLinkedListNode<Integer> node6 = new DoublyLinkedListNode<>(60);
mylist.addNode(node1);
mylist.addNode(node2);
mylist.addNode(node3);
mylist.addNode(node4);
mylist.addNode(node5);
mylist.addNode(node6);
System.out.println(mylist.toString());
System.out.println(mylist.toString());
}
}

TA貢獻1811條經驗 獲得超4個贊
你的 head 引用并不總是空的,它確實初始化了添加第一個節點,這是 traverseAndAdd() 方法中代碼中的問題。
private boolean traverseAndAdd(DoublyLinkedListNode<T> node) {
boolean isAdded = false;
while(null != head.getNext()) {
if(head.getNext() == null) {
//this code is unreachable
}
//why are u changing the head value
head = head.getNext();
}
return isAdded;
}
因此,將函數替換為
private void traverseAndAdd(DoublyLinkedListNode<T> node) {
DoublyLinkedListNode<T>temp=head;
while(null != temp.getNext()) {
temp=temp.getNext();
}
temp.setNext(node);
node.setPrev(temp);
}
另一個錯誤,在 toString() 方法中,您將 null 值分配給 head。head 值首先被初始化,但每次調用 String() 時都會變為 null。將方法替換為
public String toString() {
StringBuffer sb = new StringBuffer();
DoublyLinkedListNode<T>temp=head;
while(null != temp) {
sb.append(temp.getData());
temp = temp.getNext();
}
return sb.toString();
}
添加回答
舉報