2014-10-14 3 views
0
public void insertElementBefore(E element, E newElement) { 
    MyNode<E> current = head; 
    if (head != null) { 
     while (current != null) { 
      if (current.data.equals(element)) { 
       MyNode<E> n = new MyNode<E>(newElement); 
       n.next = current.next; 
       current.next = n; 
       return; 
      } 
      current = current.next; 
     } 
    } 
} 

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

Любая помощь будет высоко оценен

ответ

2

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

  • MyNode<E> current, который будет представлять текущий узел в одном связанном списке.
  • MyNode<E> prev, который будет представлять узел перед текущим узлом в единственном связанном списке.

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

Это как ваш код будет выглядеть следующим образом:

public void insertElementBefore(E element, E newElement) { 
    MyNode<E> current = head; 
    //check here 
    MyNode<E> prev = null; 
    if (head != null) { 
     while (current != null) { 
      if (current.data.equals(element)) { 
       MyNode<E> n = new MyNode<E>(newElement); 
       n.next = current; 
       //check here 
       if (prev != null) { 
        prev.next = n; 
       } 
       return; 
      } 
      //check here 
      prev = current; 
      current = current.next; 
     } 
    } 
} 
+0

ах, хорошо. Раньше у меня было два временных узла. Это был trailCurrent, поэтому я вроде как имел правильную идею, прежде чем я оставил это. Я использую ваше и теперь отрезаю любые данные, которые были бы получены после того, как элемент был вставлен. Попытка исправить это сейчас –

+0

Это часть процесса обучения. Просто продолжайте пытаться! –

+0

Хорошо, я исправил это. Спасибо за помощь. Я понимаю, что я сейчас делал неправильно :) –

1

Хитрость заключается в том, чтобы запомнить предыдущий узел.

MyNode<E> current = head; 
    MyNode<E> previous = null; 
    while (current != null && !current.data.equals(element)) { 
      return; 
     } 
     previous = current; 
     current = current.next; 
    } 
    MyNode<E> n = new MyNode<>(newElement); 
    n.next = current; 
    if (previous == null) { 
     head = n; 
    } else { 
     previous.next = n; 
    } 
0
void Insert_Before(int num) 
{ 
    Node *x=new Node(); 
    x->data=num; 

    if (head==NULL) { 
     x->next=head; 
     head=x; 
    } else { 
     int c=1; 
     cout<<"Element before which insertion has to take place:"; 
     cin>>n; 
     Node *temp=head; 
     Node *temp1; 

     //check whether the element is present or not 
     while (temp->data!=n) { //if present 
      temp=temp->next; 
      c=c+1; //finds the position of the element n 
     } 

     x->next=temp; 

     if (c==1) { 
      head=x; 
     } else { 
      int i=1; 
      while (i<=c-1) { 
       temp1=temp1->next; 
       i=i+1; 
      } 
      temp1->next=x; 
     } 
    } 
} //Insert_Before 
0
Node n=headNode; 
    Node prev=null; 
    while(n!=null){ 
     if(n.getData()==node){ 
      Node newNode=new Node(data); 
      prev.setNext(newNode); 
      newNode.setNext(n); 
      break; 
     } 
     else{ 
      prev=n; 
      n=n.getNext(); 
     } 
    } 
    if(n.getNext()==null){ 
     Node newNode= new Node(data); 
     prev.setNext(newNode); 
     newNode.setNext(null); 

    } 
    System.out.println("New LinkedList after insert before is:"); 
    printList(); 
} 

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

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