2017-06-22 47 views
0

我的代碼:Java的雙向隊列執行:無法找到方法addlast僅邏輯錯誤()

注意:喜歡的readInt()和readString()函數是普林斯頓大學的algs4.jar包的一部分。

import java.util.Iterator; 
 
import java.util.NoSuchElementException; 
 
import edu.princeton.cs.algs4.StdIn; 
 
import edu.princeton.cs.algs4.StdOut; 
 

 
public class Deque <Item> implements Iterable <Item> { 
 

 
    private Node <Item> front; 
 
    private Node <Item> back; 
 
    private int numberOfItems; 
 

 
    private class Node <Item> { 
 
    Item item; 
 
    Node <Item> next; 
 
    Node <Item> prev; 
 
    } 
 

 
    public Deque() { 
 
    front = null; 
 
    back = null; 
 
    numberOfItems = 0; 
 
    } 
 

 
    public boolean isEmpty() { 
 
    return (numberOfItems == 0); 
 
    } 
 

 
    public int size() { 
 
    return numberOfItems; 
 
    } 
 

 
    public void addFirst(Item item) { 
 
    if (item == null) { 
 
     // When a null element is entered 
 
     throw new java.lang.NullPointerException("Item cannot be null"); 
 
    } 
 
    Node <Item> newnode = new Node <Item>(); 
 
    newnode.item = item; 
 
    if (numberOfItems == 0) { 
 
     // When there are no elements 
 
     front = newnode; 
 
     back = newnode; 
 
    } else { 
 
     // When there are >=1 elements 
 
     newnode.prev = front; 
 
     newnode.next = null; 
 
     front.next = newnode; 
 
     front = newnode; 
 

 
    } 
 
    numberOfItems++; 
 
    } 
 

 
    public void addLast(Item item) { 
 
    if (item == null) { 
 
     // When a null element is entered 
 
     throw new java.lang.NullPointerException("Item cannot be null"); 
 
    } 
 
    Node <Item> newnode = new Node <Item>(); 
 
    newnode.item = item; 
 
    if (numberOfItems == 0) { 
 
     // When there are no elements 
 
     front = newnode; 
 
     back = newnode; 
 
    } else { 
 
     // When there are >=1 elements 
 
     newnode.next = back; 
 
     newnode.prev = null; 
 
     back.prev = newnode; 
 
     back = newnode; 
 
    } 
 
    numberOfItems++; 
 
    } 
 

 
    public Item removeFirst() { 
 
    if (numberOfItems == 0) { 
 
     // When the deque is empty 
 
     throw new NoSuchElementException("No item to remove"); 
 
    } 
 
    Item oldfirst = front.item; 
 
    if (numberOfItems == 1) { 
 
     front = null; 
 
     back = null; 
 
    } else { 
 
     front = front.prev; 
 
    } 
 
    numberOfItems--; 
 
    return oldfirst; 
 
    } 
 

 
    public Item removeLast() { 
 
    if (numberOfItems == 0) { 
 
     // When deque is empty 
 
     throw new NoSuchElementException("No item to remove"); 
 
    } 
 
    Item oldlast = back.item; 
 
    if (numberOfItems == 1) { 
 
     front = null; 
 
     back = null; 
 
    } else { 
 
     back = back.next; 
 
    } 
 
    numberOfItems--; 
 
    return oldlast; 
 
    } 
 

 
    public Iterator <Item> iterator() { 
 
    return new ListIterator(); 
 
    } 
 

 
    private class ListIterator implements Iterator <Item> { 
 
    private Node <Item> current = front; 
 

 
    public boolean hasNext() { 
 
     return (current != null); 
 
    } 
 

 
    public void remove() { 
 
     throw UnsupportedOperationException("remove is unsupported"); 
 
    } 
 

 
    public Item next() { 
 
     Item item = current.item; 
 
     current = current.prev; 
 
     return item; 
 
    } 
 
    } 
 

 
    public static void main(String[] args) { 
 
    Deque <String> deq = new Deque(); 
 
    String word; 
 
    while (!StdIn.isEmpty()) { 
 
     String cmd = StdIn.readString(); 
 
     if (cmd.equals("af")) { 
 
     word = StdIn.readString(); 
 
     deq.addFirst(word); 
 
     } else if (cmd.equals("al")) { 
 
     word = StdIn.readString(); 
 
     deq.addFirst(word); 
 
     } else if (cmd.equals("rf")) { 
 
     deq.removeFirst(); 
 
     } else if (cmd.equals("rl")) { 
 
     deq.removeLast(); 
 
     } else if (cmd.equals("noi")) { 
 
     StdOut.println(deq.size()); 
 
     } 
 
    } 
 
    } 
 
}

我實現雙端隊列爲鏈接節點的集合。每個節點都有三個特徵 - 內容,下一個項目的鏈接和前一個項目的鏈接。前面和後面的類變量分別是第一個和最後一個元素的指針。

當我用我的測試客戶端運行程序時,發現addLast(Item)這個方法將項目插入前端而不是後端。

這是怎麼發生的?我的邏輯有什麼問題?

+0

我的猜測是你交換了'front'和'back'節點的角色。你應該始終檢查你的邏輯,因爲所有的方法都可能存在類似的問題。 –

回答

1

這是您的addLast代碼

public void addLast(Item item) { 
    if (item == null) { 
     // When a null element is entered 
     throw new java.lang.NullPointerException("Item cannot be null"); 
    } 
    Node <Item> newnode = new Node <Item>(); 
    newnode.item = item; 
    if (numberOfItems == 0) { 
     // When there are no elements 
     front = newnode; 
     back = newnode; 
    } else { 
     // When there are >=1 elements 
     newnode.next = back; 
     newnode.prev = null; 
     back.prev = newnode; 
     back = newnode; 
    } 
    numberOfItems++; 
    } 

需要注意的是,當有一個節點,即frontback指向同一個節點。然後,當您將第二個節點添加到後面時,您將back.prev分配給newnode,這是錯誤的。它應該是:

back.next = newnode; 
newnode.prev = back; 
back = newnode; 
0

這是你的代碼

public void addLast(Item item) { 
    if (item == null) { 
     // When a null element is entered 
     throw new java.lang.NullPointerException("Item cannot be null"); 
    } 
    Node <Item> newnode = new Node <Item>(); 
    newnode.item = item; 
    if (numberOfItems == 0) { 
     // When there are no elements 
     front = newnode; 
     back = newnode; 
    } else { 
     // When there are >=1 elements 
     //**Here is the issue** 
     newnode.next = back; 
     newnode.prev = null; 
     back.prev = newnode; 
     back = newnode; 
    } 
    numberOfItems++; 
    } 

而不是

newnode.next = back; 
newnode.prev = null; 
back.prev = newnode; 
back = newnode; 

應該

back.next = newnode; 
newnode.prev=back; 
newnode.next = null; 
back = newnode 

希望這有助於