2014-02-20 227 views
0

我試圖實現一個insertAfterNth方法,它在雙向鏈表上的第n個元素(從1開始,不是0)之後插入一個元素。而且,我堅持將前一個節點設置爲我嘗試插入的節點。在解決問題時我需要一些幫助。謝謝。在雙向鏈表中插入元素

public class DListNode { 
    public DListNode next; 
    public DListNode prev; 
    public int item; 

    ... 
} 

public void insertAfterNth(int n, int item) { 

    if (n > length() || n < 1) { 
     System.out.println("error: out of bounds"); 
     return; 
    } 
    else if (n == length()) { 
     insertEnd(item); 
    } 
    DListNode walker = head; 
    int i = 1; 
    while (i != n) { 
     i++; 
     walker = walker.next; 
    } 
    DListNode node = new DListNode(item); 
    node.next = walker.next; 
    walker.next.prev = node; /* not sure if this line of code is right, regardless this method is giving me errors(I'm most certain that this line is causing the problem)*/ 
    walker.next = node; 
    node.prev = walker; 
    size++; 
} 
+1

看不到的問題,但你爲什麼不嘗試和'after'節點從那裏設置成'walker.next'和工作?代碼會更簡單。另外,將'walker'重命名爲''之前'。 – fge

+0

原則上,代碼是可以的。但是您需要處理特殊情況以分別插入列表的前面或末尾。 – Henry

回答

0

嘗試使用

  • (walker.next).prev

我可能是錯的。

0

代碼大部分是正確的。您必須在列表的開頭添加一個用於插入的方法,但是從描述/方法名稱開始,您似乎在節點之後插入,因此在開始時添加插入可能沒有意義。當頭節點爲空時,您必須檢查情況。如果操作成功,另一個消息是返回一個布爾值。另一個好的返回可以是新插入的節點,如果操作失敗,則返回null。如果你不想返回一個值,你也可以拋出異常。

public class DoubleLinkedList { 

private DListNode head; 
private DListNode tail; 
private int size; 

private class DListNode { 
    private DListNode next; 
    private DListNode prev; 
    private int item; 

    private DListNode(final int item) { 
     this.item = item; 
    } 
} 

public void insertAfterNth(final int n, final int item) { 
    if (size == 0) { 
     System.out.println("error: list is empty"); 
    } else if ((n > size) || (n < 1)) { 
     System.out.println("error: out of bounds"); 
     return; 
    } else if (n == size) { 
     insertEnd(item); 
    } 
    DListNode walker = head; 
    int i = 1; 
    while (i < n) { 
     i++; 
     walker = walker.next; 
    } 
    DListNode node = new DListNode(item); 
    node.next = walker.next; 
    walker.next.prev = node; 
    walker.next = node; 
    node.prev = walker; 
    size++; 
} 

private void insertEnd(int item) { 
    size++; 
    final DListNode newItem = new DListNode(item); 
    if (head == null) { 
     head = newItem; 
     tail = newItem; 
    } else { 
     tail.next = newItem; 
     newItem.prev = tail; 
     tail = newItem; 
    } 
} 

public void add(final int item) { 
    insertEnd(item); 
} 

//the rest of operations you wish to implement 

}