Помогите составить односвязный список в Java - PullRequest
1 голос
/ 21 сентября 2010

Это для домашней работы, но, пожалуйста, знайте, что я искал онлайн помощь (например, http://www.sethi.org/classes/class_stuff/cis435/others/notes-java/data/collections/lists/simple-linked-list.html) и мой учебник, но у меня все еще есть некоторые проблемы.

Любая помощь будет оценена ...

Сейчас я пытаюсь просто вставить значения, но ничего не получается. Будь то первый элемент, добавляется ли он как последний или где-то посередине.

Node header = null;    // First element of list.
Node back  = null;    // Last element of list.

public void insert(int i, double value){ //insert value before i-th element
  Node e = new Node();
  e.num = value;
  Node curr = header;
  for(int x=0;x<i;x++) {
   if (i == 1) { //we want to insert as first thing
    if (size == 0) { //its the FIRST time we add something
     header.next = e;
     e.next = back;
     break;
    } else if (size == 1){
     e.next = header.next; //i.e. the second thing in the list
     header.next = e;
     break;
    } else {
     e.next = header.next.next; //i.e. the second thing in the list
     header.next = e;
     break;
    }
   }
   else if (x == (i-1)) {
    e.next = curr.next;
    curr.next = e;
    break;
   }
   curr = curr.next;
  }
  size = size+1;
 }

Не совсем уверен, почему это не работает.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 21 сентября 2010

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

insert(index, value)
    if index>size
        throw null pointer
    traverse to index -1 //lets call this nodeI
    create newnode and set value
    set newnode.next to nodeI.next
    set nodeI.next to newnode
    increase size.

Пара полезных советов для вас, у вас должна быть функция для получения элемента из списка ссылок, который возвращает узел? открытый узел elementAt (int index) например? используйте это, чтобы просмотреть связанный список. Если вы хотите добавить в связанный список, попробуйте это

append(value)
    insert(size-1,value)

а если вы хотите вставить в начале? та же идея

insert(value)
    insert(0,value)
1 голос
/ 21 сентября 2010
  1. В строке e.next = header.next.next, что произойдет, если header.next будет указывать на «ноль»? Можно ли туда добраться?
  2. С какими угловыми случаями вам приходится иметь дело и учитывали ли вы их все?
  3. Можете ли вы начать с самого простого случая, добавив либо элемент спереди, либо элемент сзади? Затем использовать эти функции для реализации вставки?
1 голос
/ 21 сентября 2010

Несколько предложений:

  1. реализовать java.util.List
  2. Подумайте о дженериках
  3. Читать это .

Начните с "вставить в конце", прежде чем подумать о "вставить в i".

0 голосов
/ 10 сентября 2015

Я попробовал простую программу, которая будет полезна для вас, ребята, я также изучаю Java, пожалуйста, терпите меня за любые ошибки, но эта программа отлично работает.

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

LinkList.java

class LinkList
{
 public static void main(String args[])
 {
  Node node = new Node(1);
  node.addAtLast(2);
  node.addAtLast(3);
  node.addAtLast(4);
  node.addAtLast(5);
  node.printList();
 }

}

Node.java

class Node
{
 private int data;
 private Node link;

 public Node(int mydata)
 {
  data = mydata;
  link = null;
 }

 public void printList()
{
 System.out.print("|"+data+"|"+"->");
 if(link != null)  
 {
//recursive call
 link.printList();

 }
else
 {
//marking end of list as NULL
 System.out.print("|NULL|"); 
 }
}

public void addAtLast(int mydata)
{
 if(link == null)
 {

  link = new Node(mydata);
 }
 else
 {
  link.addAtLast(mydata);
 }

}

}

ВЫХОД:

Ниже приведен наш вывод

| 1 | -> | 2 | -> | 3 | -> | 4 | -> | 5 |-> | NULL |

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...