2017-01-23 3 views
-1

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

public class singlylinkedlist { 
link head; 
static class link 
{ 
    int data; 
    link nextNode; 
    link(int dat) 
    { 
     data=dat; 
     nextNode=null; 
    } 
} 
public static void insertbegin(link head,int x) 
{ 
    link newnode=new link(x); 
    newnode.nextNode=head; 
    head=newnode; 
} 
static void display(link head) 
{ 
    if(head==null) System.out.println("empty list"); 
    else 
    { 
     link temp=head; 
     while(temp!=null) 
     { 
      System.out.println(temp.data); 
      temp=temp.nextNode; 
     } 
    } 
} 
public static void main(String args[]) 
{ 
    singlylinkedlist link=new singlylinkedlist(); 
    link.head=new link(2); 
    insertbegin(link.head,1); 
    display(link.head); 
    } 
} 

Заранее спасибо

+0

Поскольку вы воссоздаете колесо (не уверен, что это тоже поговорка на английском тоже ...), я бы предположил, что это домашнее задание. Поэтому вы должны хотя бы объяснить, что происходит в этом коде. PS: Добро пожаловать на SO, см. [Ask] – AxelH

+0

Вы говорите, что неправильно вставлены, но вы не говорите, в чем проблема. Пожалуйста, обновите сообщение, чтобы быть более конкретным. – Aaron

+1

Том, чтобы избежать путаницы, я бы переименовал ссылку в ссылку «singlylinkedlist», поскольку у вас есть класс и экземпляр с тем же именем. –

ответ

1

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

Теперь на ваш вопрос: Ваша ошибка заключается в следующем: внутри ваших методов, если вы назначаете новое значение переменной head, которая присваивается методу, это изменение влияет только на переменную head, которая предоставляется методу (только в области методов). Если вы хотите изменить фактическую переменную head, вам нужно назначить новое значение непосредственно классам переменной head.

В зависимости от вашего потребительной случае, есть 3 решения:

  1. Вам необходимо несколько экземпляров вашей реализации LinkedList:
    • изменить методы insertBegin и display, чтобы быть не статичным.
    • Удалить первый параметр методов, так как они теперь могут получить доступ к переменной head класса
  2. Вам нужно только один экземпляр вашей реализации LinkedList (не очень хорошее решение):
    • Сделайте вашу переменную голову внутри класса static
    • Удалить первый параметр методов, так как они теперь могут получить доступ к переменной head класса
  3. Вы хотите сохранить статический/нестатический шаблон для переменных/методов (по какой-либо причине):
    • изменить поведение переменной head: Теперь не хранит фактические данные, но вместо этого сохраняет фактическое (с данными) в качестве переменной nextNode.
    • display теперь всегда читает начиная с head.nextValue
    • insertBegin Теперь не придется переписывать фактическую переменную голову. он имеет только установить свою переменную nextNode нового главы

Если вы хотите, я могу дать вам пример одного из этих случаев. Я просто не хотел их выписывать и позволял тебе самому разбираться.


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

0

Ваш код имеет много ошибок. Это не так, как можно было бы написать связанный список. См. Ответ @MichaelRitter и исправьте их.

Сделать все функции в singlylinkedlist классе не статичны, перемещать link класс вне singlylinkedlist класса и написать метод main() в другом классе вне singlylinkedlist класса.

Что касается вашего метода insertbegin(), вам в первую очередь нужно сделать его нестатичным. Кроме того, вам нужно принять только целочисленное значение в параметре функции, которое вы хотите вставить в начале; взятие головного узла связанного списка здесь бесполезно. Кроме того, вам нужно проверить, есть ли головной узел связанного списка null, прежде чем что-либо делать, иначе вы получите NullPointerException.

Вот рабочая версия insertbegin() способа singlylinkedlist класса:

public void insertbegin(int x){ 
    link temp = new link(x); 
    if(head == null) 
     head = temp; 
    else{ 
     link ts = head; 
     head = temp; 
     head.nextNode = ts; 
    } 
} 

Если вы хотите вставить 1 в начале singlylinkedlist называется link, вы можете вызвать функцию insertbegin() как:

link.insertbegin(1); 

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

+0

внутренний класс на самом деле хорошо. я бы сделал его private tho (no1 за пределами класса связанного списка должен уметь видеть узлы –

Смежные вопросы