我正在尝试将节点添加到双向链接列表中,该值是音乐,但我想保持其位置的顺序,就像在播放列表中一样。 当我尝试访问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) {
}
}
答案 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;
}
}