Хранить более 1 элемента данных по одному индексу в связанном списке? - PullRequest
1 голос
/ 10 октября 2008

Я пытаюсь сохранить более 1 элемента данных по одному индексу в моем связанном списке. Кажется, что все примеры в моем учебнике иллюстрируют добавление только 1 фрагмента данных в индекс. Я предполагаю, что можно добавить еще?

Например, используя API коллекций для хранения целого числа, я бы сделал следующее:

LinkedList <Integer>linky = new LinkedList<Integer>();
int num1 = 2, num2 = 22, num3 = 25, num4 = 1337;
linky.add(num1);

Как мне добавить num2, num3 и num4 к одному первому индексу в списке? Спасибо, парни.

Ответы [ 6 ]

15 голосов
/ 10 октября 2008

Кажется, есть небольшая путаница в том, как работают связанные списки. По сути, связанный список состоит из узлов, каждый из которых содержит один элемент данных (точнее, сам объект, который может содержать несколько переменных-членов) и ссылку на следующий узел в списке (или нулевой указатель, если существует). нет такого следующего узла). Вы также можете иметь двусвязный список, где каждый узел также имеет указатель на предыдущий узел в списке, чтобы ускорить определенные виды шаблонов доступа.

Добавление нескольких «фрагментов данных» к одному узлу звучит как добавление нескольких ссылок с одного узла, что превращает ваш связанный список в N-арное дерево .

Чтобы добавить несколько частей данных в конец списка, способом, наиболее часто связанным со связанным списком, просто выполните:

LinkedList <Integer>linky = new LinkedList<Integer>();
int num1 = 2, num2 = 22, num3 = 25, num4 = 1337;
linky.add(num1);
linky.add(num2);
linky.add(num3);
linky.add(num4);

В качестве альтернативы, если вы хотите, чтобы каждый узел связанного списка имел несколько частей данных

Эти данные должны быть упакованы в объект (путем определения class, в котором все они являются переменными-членами). Например:

class GroupOfFourInts
{
   int myInt1;
   int myInt2;
   int myInt3;
   int myInt4;

   public GroupOfFourInts(int a, int b, int c, int d)
   {
     myInt1 = a; myInt2 = b; myInt3 = c; myInt4 = d;
   }
}

class someOtherClass
{

  public static void main(String[] args)
  {
    LinkedList<GroupOfFourInts> linky = new LinkedList<GroupOfFourInts>();
    GroupOfFourInts group1 = new GroupOfFourInts(1,2,3,4);
    GroupOfFourInts group2 = new GroupOfFourInts(1337,7331,2345,6789);
    linky.add(group1);
    linky.add(group2);
  }
}

Теперь linky будет иметь 2 узла, каждый из которых будет содержать 4 int s, myInt1 , myInt2 , myInt3 и myInt4 .

Примечание

Ничто из вышеперечисленного не относится к связанным спискам. Этот шаблон следует использовать всякий раз, когда вы хотите хранить кучу данных вместе как единое целое. Вы создаете класс, который имеет переменные-члены для каждой части данных, которые вы хотите сохранить вместе, а затем создаете любой тип коллекций Java (ArrayList, LinkedList, TreeList, ...) этого типа.

Убедитесь, что вы хотите использовать связанный список (поскольку с точки зрения сложности программирования при выборе ArrayList или TreeList нет штрафов). Это будет зависеть от вашей схемы доступа к данным. Связанные списки обеспечивают O (1) добавление и удаление, но O (n) поиск, тогда как ArrayLists обеспечивают O (1) поиск, но O (n) произвольное добавление и удаление. TreeLists обеспечивают вставку, удаление и поиск O (log n). Компромисс между ними зависит от объема данных, которые у вас есть, и от того, как вы собираетесь изменять и получать доступ к структуре данных.

Конечно, все это не имеет значения, если в вашем списке будет, скажем, <100 элементов; -) </p>

Надеюсь, это поможет!

3 голосов
/ 10 октября 2008

Используйте структуру.

Например:

private struct Node
{
    int Num1;
    int Num2;
    int Num3;
}

...

LinkedList<Node> list = new LnkedList<Node>();

Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.Add(n);

Примечание; Я предполагаю, что это в C #; поправьте меня, если я ошибаюсь, и я исправлю код;)

Если вы еще не прошли ООП в своей книге - тогда я бы рекомендовал попробовать; это поможет вам решить такие проблемы.

1 голос
/ 10 октября 2008

Как сказал Нельсон, вам нужен еще один объект в Java, хотя вам нужно использовать класс. Если вам нужен класс Node для использования вне класса, в котором вы работаете, то вам нужно сделать его классом Public и переместить его в свой собственный файл.

private Class Node
{
    //You might want to make these private, and make setters and getters
    public int Num1;
    public int Num2;
    puclic int Num3;
}

LinkedList<Node> list = new LinkedList<Node>();

Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.Add(n);

Извинения перед Нельсоном за кражу его кода;)

1 голос
/ 10 октября 2008

Почему бы не что-то подобное:

LinkedList<LinkedList<Integer>> linky = new LinkedList<LinkedList<Integer>>();
//...
linky.add(new LinkedList<Integer>().add( //...
0 голосов
/ 10 октября 2008

Я не совсем понимаю, чего вы пытаетесь достичь, поэтому я предлагаю решение еще одного прочтения проблемы (в Java).

LinkedList <Integer>linky = new LinkedList<Integer>();
linky.add(num1);

// Lots of code possibly adding elements somewhere else in the list

if (linky.size() > 0) { // Always good to be sure; especially if this is in another methode
 int first = linky.get(0);
 linky.set(0, first + num2);// Value of linky.get(0) is num1 + num2 
}


// The same again
// Lots of code possibly adding elements somewhere else in the list

if (linky.size() > 0) { // Always good to be sure; especially if this is in another methode
 int first = linky.get(0);
 linky.set(0, first + num3); // Value of linky.get(0) is num1 + num2 + num3
}

Лично мне больше всего нравится решение Нельсона, если количество добавляемых чисел постоянно (num1 .. num4), и если это не константа, я бы предпочел решение Грегора (который использует список вместо узла). Если вы выберете метод Node в Java, я предлагаю:

// added static, Class to class
private static class Node
{
    //You might want to make these private, and make setters and getters
    public int Num1;
    public int Num2;
    puclic int Num3;
}

// Prefer interfaces if possible
List<Node> list = new LinkedList<Node>();

Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.add(n); // Add -> add

Много придирки, но я думаю, что статический класс вместо нестатического частного класса предпочтителен, если это возможно (и обычно должно быть возможно).

0 голосов
/ 10 октября 2008

Вот полный пример кода, который показывает использование добавления структуры в связанный список:

import java.util.LinkedList;
class Node {
    int num1;
    int num2;
    int num3;
    int num4;
    public Node(int a, int b, int c, int d) {
        num1 = a; num2 = b; num3 = c; num4 = d;
    }
}
public class dummy {
    public static void main(String[] args) {
        LinkedList <Node>linky = new LinkedList<Node>();
        x myNode = new Node(2, 22, 25, 1337);
        linky.add(myNode);
    }
}
...