我有一个问题,我在互联网上环顾四周但却找不到一个例子。但是在java中创建一个String 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 :(得分:2)
假设
你应该记住,在java中没有公开LinkedList的内部实现(注意: java.util.LinkedList.Node 具有私有访问修饰符),所有修改通过迭代器和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),那么,假设您使用双向链表实现它,它将是这样的:
编辑:我的不好,你可以迭代到第一个非空元素并直接设置引用,更新算法
- 获取第一个元素
- 获取的元素为空时获取
- 设置 head 对最后一个fetched元素的引用,将last fetched element的 prev 引用设置为null
- 获取最后一个元素
- 获取的元素为空时获取前一个
- 将尾部引用设置为最后一个获取的元素,将上次获取的元素的 next 引用设置为null
醇>
更新使用您提供的代码尝试类似这样的内容(因为您使用的是单链接列表,它与上述内容略有不同):
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&¤t.next!=null&¤t.next.data>'\u0020'){
current = current.next;
}
//right trim
this.back = current;
if (current!=null){
current.next = null;
}
}
答案 1 :(得分:1)
假设您只想修剪LinkedList中的每个String,为什么不迭代每个项?
LinkedList<String> myNodes = new LinkedList<String>();
myNodes.add('This is a node ');
myNodes.add(' another node '));
for (String s : myNodes){
s.trim();
}