2014-02-20 146 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 

}