2013-11-22 5 views
0

У меня вопрос, я огляделся по интернету, но не смог найти пример. Но сделать облицовку String() метод в Java (удаление свинца/завершающие пробельные), я знаю, что базовый код для этого:метод trim() для связанного списка

public LString trim(){ 
    int i = this.size; 
    int j = 0; 
    int k = this.offset; 
    char[] arrayOfChar = this.data; 
    while ((j < i) && (arrayOfChar[(k + j)] <= ' ')) 
     ++j; 
    while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' ')) 
     --i; 
    return (((j > 0) || (i < this.size)) ? substring(j, i) : this); 
} 

Но, как бы вы написать этот же метод, но применительно к связанным список? Более конкретно, связанный список, который использует класс Node.

Вот что я сделал ... исправьте меня, если это не так ... Я включу соответствующую информацию о классе, относящуюся к вопросу.

public class LString{ 

    private Node front = null; //first val in list 
    private Node back; //last val in list 
    private int size = 0; 
    private int i; 
    private int offset; 

    public LString(){ 
     //construct empty list 
     Node LString = new Node(); 
     front = null; 

    } 
.......//skip down some methods to this one 

    //returns new lstring that is slice of lstring 
    //contains an endIndex as well 
    public LString substring(int beginIndex, int endIndex){ 
     Node current = this.front; 
     int size = 0; 
     while(current != null && size < beginIndex){ 
     size++; 
     current = current.getNext(); 
     } 
     front = new Node(); 
     front.setData(current.getData()); 
     Node ocurrent = front; 

     while(current != null && size < endIndex){ 
     current = current.getNext(); 
     Node curr2 = new Node(); 
     curr2.setData(current.getData()); 

     ocurrent.setNext(curr2); 
     ocurrent = curr2; 
     size++; 
     }  
     ocurrent.setNext(null); //set next val to null to term string 
     return this; 
    } 

    public LString trim(){ 
     String lstr; 
     int i = this.size; 
     int m = this.offset; 
     int k = charAt(m); 
     Node current = front; 
     while(current != null){ 
     current = current.getNext(); 
     if(current.data > '\u0020'){ 
     return this; 
     } else if(current.data < '\u0020'){ 
      LString lstring = new LString(); //this worked!? 
      return lstring; 
      } 
     } 
     return this.substring(k, m+1); 
    } 

........................................... ....................

//My Node class: 


public class Node{ 
    public char data; 
    public Node next; 

    //constructors from page 956 
    public Node() 
    { 
     this('\0',null); //'\0' is null char for java 
    } 

    public Node(char initialData, Node initialNext) 
    { 
     data = initialData; 
     next = initialNext; 
    } 
    } 

(Если вы не знакомы с классом узла, в основном он только создает односвязанны узел для использования в качестве ссылок между данными в вашем списке связанных классов)

Я никогда не видел примера или чего-то еще, поэтому я думал, что попрошу сообщество.

+0

Эти данные в узле будут иметь тип String, и вы вызовете метод trim на этой строке. – SudoRahul

+0

Можете ли вы привести пример о том, что вы ожидаете? –

ответ

1

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

LinkedList<String> myNodes = new LinkedList<String>(); 
myNodes.add('This is a node '); 
myNodes.add(' another node ')); 

for (String s : myNodes){ 
    s.trim(); 
} 
+0

Я обновил свой код тем, что я попробовал – AOE

2

Предполагая, что

  • путем обрезки списка вы хотите удалить начальные и конечные элементы, которые являются нуль
  • и под «связанный список, который использует класс Node» вы имеете в виду java.util.LinkedList

Вы должны иметь в виду, что в java внутренняя реализация LinkedList не отображается (примечание: java.util.LinkedList.Node имеет private модификатор доступа), все модификации выполняются с помощью методов итератора и самого LinkedList.

Осуществление будет:

public static void trim (LinkedList list){ 
    if (list == null || list.size() == 0) return; 

    Object element = null; 

    ListIterator i = list.listIterator(); 
    while (i.hasNext() && element == null) { 
     element = i.next(); 
     if (element == null) { 
      i.remove(); 
     } 
    } 

    element = null; 
    i = list.listIterator(list.size()); 
    while (i.hasPrevious() && element == null) { 
     element = i.previous(); 
     if (element == null) { 
      i.remove(); 
     } 
    } 
} 

Однако, если вы реализовав изменяемые строки через связанный список как упражнение (если не как упражнение, то остановись и использовать StringBuilder или StringBuffer), а затем, предполагая, что вы реализуете его с дважды связанным списком, он будет выглядеть следующим образом:

EDIT: мой плохой, вы можете перебирать первый непустой элемент и задавать ссылку d irectly к нему, обновленный алгоритму

  1. Fetch первого элемент
  2. Хотя неправдоподобный элемент пуст принести следующий
  3. Set голову ссылку на последний извлеченной элемент, пред набора последнего загруженного элемента ссылки на null
  4. Извлечь последний элемент
  5. В то время как извлеченный элемент пуст, забрать предыдущий
  6. Набор хвост ссылка на последний извлеченной элемент, комплект следующего ссылки последнего загруженного элемента обнулить

UPDATE С кодом вы предоставили попробовать что-то вроде этого (так как вы используете однократно связанный список, он немного отличается от описанного выше):

public void trim(){ 
    //early out if empty 
    if (front == null || back==null) return; 

    Node current = front; 

    //looking for the first non-empty element 
    while(current != null && current.data<'\u0020'){ 
     current = current.next; 
    } 

    //left trim 
    this.front = current; 

    //looking for last non-empty element 
    while (current!=null&&current.next!=null&&current.next.data>'\u0020'){ 
     current = current.next; 
    } 

    //right trim 
    this.back = current; 
    if (current!=null){ 
     current.next = null; 
    } 
} 
Смежные вопросы