将元素添加到双向链接列表中以保持订单

时间:2017-07-02 16:24:11

标签: java doubly-linked-list

我正在尝试将节点添加到双向链接列表中,该值是音乐,但我想保持其位置的顺序,就像在播放列表中一样。 当我尝试访问music.head.next时,它返回一个java.lang.NullPointerExecption。

class Music {
   String title;
   int position;
}
class Node {
   Music value;
   Node next;
   Node prev;
}

class myList {
   Node head;
   Node tail;
}

class Main {

   static void addMusic (myList musics, Music music) {

   Node node = new Node();
   node.value = music;

   if (musics.head == null) {
       musics.head = node;
       musics.tail = node;
   }  else {
       Node current = musics.head;
       Node previous = current;
       while (current != null) {
           if (current.value.position > music.position) {
               node.next = current;
               current.prev = node;
               node.prev = previous;
               previous.next = node;
           }
           previous = current;
           current = current.next;
       }

   }
}

   public static void main (String[] args) {

   }

}

1 个答案:

答案 0 :(得分:0)

您的addMusic版本未处理将元素添加到非空列表的列表末尾的情况。当元素插入列表中时,您也可以跳出while循环,以防止进行一些不必要的检查:

public void addMusic (MusicList musics, Music music)
{
  Node node = new Node();
  node.value = music;

  if (musics.head == null)
  {
    // list is empty
    musics.head = node;
    musics.tail = node;
  }
  else if (music.position > musics.tail.value.position)
  {
    // add at the end

    // update "pointers"
    musics.tail.next = node;
    node.prev = musics.tail;

    // add the new element at the end of the list
    musics.tail = node;
  }
  else
  {
    // search for the insertion position
    Node current = musics.head;
    Node previous = current;
    while (current != null)
    {
      if (current.value.position > music.position)
      {
        node.next = current;
        current.prev = node;
        node.prev = previous;
        previous.next = node;
        break;
      }
      previous = current;
      current = current.next;
    }
  }
}

以下是我的其他测试代码(我确实添加了一些toString()方法,因此更容易检查方法的作用。我将类myList重命名为有效类Java中的名称:

public void test()
{
  MusicList myMusic = new MusicList();
  addMusic(myMusic, new Music("Title1", 1));
  addMusic(myMusic, new Music("Title3", 3));
  addMusic(myMusic, new Music("Title2", 2));
  addMusic(myMusic, new Music("Title4", 4));
  System.out.println(myMusic.toString());
}

public class Music
{
  String title;
  int position;

  public Music (String title, int position)
  {
    this.title = title;
    this.position = position;
  }

  @Override
  public String toString()
  {
    return "#" + position + " " + title;
  }
}


public class Node
{
  Music value;
  Node next;
  Node prev;

  @Override
  public String toString()
  {
    return value.toString();
  }
}

public class MusicList
{
  Node head;
  Node tail;

  @Override
  public String toString()
  {
    String result = "My List:";
    Node current = head;
    while (current != null)
    {
      result += "\r\n   " + current;
      current = current.next;
    }
    return result;
  }
}