2017-01-30 4 views
1

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

package node; 

public class IntNode { 

    public int data; 
    public IntNode next; 
    public IntNode(int data, IntNode next) { 
     this.data = data; this.next = next; 
    } 
    public String toString() { 
     return data + ""; 
    } 


    public static IntNode addBefore(IntNode front, int target, int newItem) { 
     IntNode ptr = front; 
     while(ptr != null) 
     { 

      if(ptr.data == target) 
      { 
       IntNode temp = new IntNode(newItem, ptr.next); 
       ptr.next = temp; 
      } 
      ptr = ptr.next; 
     } 
     return front; 

    } 

    public static void main(String[] args) { 
     IntNode L = null; //handle for the beginning of the LL 
     L = new IntNode(19, null); 
     IntNode temp = new IntNode(17, L); 
     L = temp; 
     addBefore(L, 17, 20); 
     traverse(L); 
    } 

     public static void traverse(IntNode front){ 
      IntNode ptr = front; //ptr points to the first node of the LL 

      while(ptr != null){ 
       System.out.print(ptr.data + " -> "); 
       ptr = ptr.next; 

     } 
     System.out.println("//"); 
     } 
    } 

Конечно, вместо добавления к цели добавляется новая температура узла. Есть ли способ изменить направление указателя так, чтобы его можно было перемещать, чтобы указать на пробел перед целевым целым?

+0

Я удалил тэг вопроса [тег: javascript]. Пожалуйста, поймите, что Java и JavaScript являются двумя совершенно разными языками, что теги вопросов и заголовки вопросов являются наиболее важными частями вашего вопроса, и если вы отключены, вы не получите правильных экспертов, чтобы увидеть ваш вопрос. Просто FYI. –

+0

1) Держите указатель 'предыдущий', который всегда на один шаг ниже' ptr'; 2) убедитесь, что вы обрабатываете случай, когда первый элемент списка имеет цель, потому что для этого требуется специальная обработка. – ajb

+0

Вы должны удалить модификатор 'static' из' addBefore() '. Затем вы также можете удалить «IntNode front» из списка параметров. Затем вы вызываете что-то вроде 'L.addBefore (17, 20)'. Вам также необходимо внести некоторые изменения в 'addBefore()'. Вы должны больше изучать программирование Object Orient в Java. –

ответ

0

Используйте второй указатель, скажем, это prev, чтобы указать на узел перед ptr так, что как только вы найдете целевой узел, вы можете добавить новый узел после prev с next поля нового узла, указывающими на ptr. Тем не менее, особый случай, на который вы должны обратить внимание, это то, что цель является главой списка. В этом случае вы должны сделать новый узел новым заголовком списка. Вот как это должно выглядеть,

public static IntNode addBefore(IntNode front, int target, int newItem) { 
    IntNode prev = null; 
    IntNode ptr = front; 
    while(ptr != null) 
    { 
     if(ptr.data == target) 
     { 
      if(prev == null) 
      { 
       front = new IntNode(newItem, front); 
      } 
      else 
      { 
       prev.next = new IntNode(newItem, ptr); 
      } 
      break; 
     } 
     prev = ptr; 
     ptr = ptr.next; 
    } 

    return front; 
} 
0

Как насчет изменения данных текущего узла?

public static IntNode addBefore(IntNode front, int target, int newItem) { 
    if (front.data == target) { 
     IntNode currentFront = new IntNode(front.data, front.next); 
     front.data = newItem; 
     front.next = currentFront; 
    } else { 
     return addBefore(front.next, target, newItem); 
    } 
    return front; 
} 

Ваш

public static void main(String[] args) { 
    IntNode L = null; //handle for the beginning of the LL 
    L = new IntNode(19, null); 
    IntNode temp = new IntNode(17, L); 
    L = temp; 
    traverse(L); 
    addBefore(L, 17, 20); 
    traverse(L); 
} 

дал мне:

17 -> 19 -> // 
20 -> 17 -> 19 -> // 

Другая попытка:

traverse(L); 
addBefore(L, 19, 20); 
traverse(L); 

дает:

17 -> 19 -> // 
17 -> 20 -> 19 -> //