在双向链表中插入元素

时间:2014-02-20 09:13:44

标签: java linked-list doubly-linked-list

我试图实现一个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++;
}

2 个答案:

答案 0 :(得分:0)

尝试使用

  • (walker.next).prev

我可能错了。

答案 1 :(得分:0)

代码大多是正确的。您必须在列表的开头添加一个插入方法,但是根据您的描述/方法名称,您似乎在> 节点之后插入,因此在开始时添加插入可能没有意义。当head节点为null时,您必须检查大小写。另一个问题是如果操作成功则返回一个布尔值。另一个好的返回可以是新插入的节点,如果操作失败则返回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

}