在Java中的双向链接列表中添加另一个对象

时间:2014-08-04 12:37:41

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

我在Java中编写了一个双向链表的简单实现,包含Person-objects。

class Node {
    Node next, previous;
    Object data;

    Node() {
        next = null;
        previous = null;
        data = null;
    }
}

我还有一个带有代码的Person-class:

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
    //Other methods
}

然后我有一个PersonList类,我在其中定义了插入和搜索Person-objects的方法:

class PersonList {
    Node first, last, previous;

    public void insert(Object myObject) {
        Node n = new Node();
        n.data = myObject;

        //If list is empty
        if(first == null) {
            first = n;
            last = n;
        }
        else {
            n.previous = last;  
            last.next = n;    
            last = n;
        }
    }
}

所以这是我的问题:我正在尝试编写一个带有两个参数的方法:(i)一个新的Person-object和(ii)一个包含名字的String变量。方法是在名称匹配的人(所有名称都是唯一的)之前插入新对象。

public void insertBefore(Object myObject, String name)

我已经通过编写方法对方法进行了测试,以便在实现方法之后正确地找到新Person之前和之后的对象。现在,我的问题是改变节点,使它们指向正确的对象。

我有以下逻辑:如果列表中没有人,请执行简单insert() - 方法的第一部分。 否则,遍历搜索名称与给定名称匹配的Person的人员。如果找到该人,将其当前的前一个节点指针更改为指向newPerson,则newPerson的下一个指针必须指向当前人,最后,当前人必须是新人。

public void insertBefore(Object myObject, String beforeThisName) {
        Node n = new Node();
        Node current = first;
        n.data = myObject;

        //If no people in list (I already have code for this one)

        //Else, if the list contains people
        else {

            //Iterate through list
            while(current != null) {
                Person currentPerson = (Person) current.data;
                String currentName = currentPerson.getName();

                //If the Person is found
                if(currentName.equalsIgnoreCase(beforeThisName)) {
                    //This is simply a check to see whether loop finds the right position
                    System.out.println(current.previous.data.toString());   //After this person
                    System.out.println(current.data.toString());    //Before this person

                    /* Here is where the inserting before happens. */
                    current.previous = n;   //The current person's previous person is the new person
                    n.next = current;   //new person's next pointer is the current person 
                    current = n;  //current person is the new person
                    return;
                }
                current = current.next;
            }
        }
    } 

对此有任何帮助,我们非常感谢。我正在努力教自己的名单,而这个问题让我陷入了一段时间。谢谢!

2 个答案:

答案 0 :(得分:3)

仅将新Person的下一个设置为currentPerson而将currentPerson的前一个设置为新Person是不够的。您还必须将新Person的前一个设置为currentPerson的原始前一个,以及新Person之前的下一个原始。

                n.previous = current.previous;
                n.previous.next = n;
                current.previous = n;   //The current person's previous person is the new person
                n.next = current;   //new person's next pointer is the current person 
                current = n;  //current person is the new person

当然,你必须验证这些节点都不是null(因为你要添加的新Person可能是列表中的第一个Node)。

因此,如果这是列表的原始状态,并且您希望在" Prev"之间添加新节点。和"当前" :

       --------  next ----> -----------
       - Prev -             - current -
       --------  <---- prev ----------- 

您必须设置新节点n的两个指针并更新两个指针 (currrent.previous和Prev.next):

       --------  next ----> ----------- next ----> -----------
       - Prev -             -    n    -            - current -
       --------  <---- prev ----------- <---- prev -----------

答案 1 :(得分:2)

在双向链接列表中,您还有一个next指针,所以您需要做的是:

  • 保存current.previous,例如到oldPrevious
  • current.previous设为newNode,将newNode.next设为current
  • oldPrevious.next设为newNode,将newNode.previous设为oldPrevious