在 Java 中跟踪 ListNode 的头部
Keeping track of head of ListNode in Java
我目前正在开发自己的 Java class 称为 LString,它用于在字符链表和字符串链表之间来回转换。
我的 toString() 方法有问题,特别是跟踪链表的 "head" 以便遍历它并将字符连接成一个新字符串。在研究时,我读到我应该以某种方式跟踪列表的头部,但我不知道如何实现它。
如有任何帮助,我们将不胜感激!
编辑:我收到的错误消息是:
LString.java:79: 错误: 找不到符号
ListNode current = this.front;
public class LString{
private static int length;
// ListNode constructors
// Creates a new ListNode with characters stored in variable "data" and
// Node named next
private class ListNode{
char item;
ListNode next;
private ListNode(){
}
// creates a new ListNode that has the value and links to the specified ListNode
private ListNode(char item, ListNode next){
this.item = item;
this.next = next;
}
// given a character, creates a new ListNode that doesn't link to anything
private ListNode(char item){
this.item = item;
this.next = null;
}
}
public LString(){
this.length = 0;
ListNode front = new ListNode();
}
//LString
// Takes in a String object and loops until it has added all characters to a new linked list
public LString(String original){
ListNode front;
this.length = 1; // length keeps track of number of nodes
if (original.charAt(0) == 0){ // creates a new ListNode if it is an empty string
front = new ListNode();
}
else {
front = new ListNode(original.charAt(0));
}
//System.out.println("this is happening " + front.item);
//ListNode current = front;
for (int index = 1; index < original.length(); index++) {
front.next = new ListNode(original.charAt(index), front.next);
front = front.next;
//System.out.println("strings: " + front.item);
length++;
}
//System.out.println("length: " + length);
}
// returns length of the LString object
public int length(){
return this.length;
}
// toString takes an LString object and converts it to a string
public String toString(){
StringBuilder newString;
ListNode current = this.front;
while (current.next != null){
newString.append(current.item);
current = current.next;
}
return newString.toString();
}
public static void main(String[] args){
LString stuffTest = new LString("hello");
int valueOf = stuffTest.length();
System.out.println(stuffTest.length());
String testMeWhy = stuffTest.toString();
}
}
通过追加到末尾来构建链表的一般模式是:
开头:
head = null;
tail = null;
要将 newNode
添加到列表中:
if (head == null) {
head = newNode;
} else {
tail.next = newNode;
}
tail = newNode;
我认为您试图通过在列表中只保留一个指针来做到这一点 class,但效果不是很好。此外,使用此模式做事意味着您不必在列表的前面有一个 "special" 节点,除非有其他一些充分的理由。看起来您正在尝试不带参数地使用 new ListNode()
来创建某种特殊节点,但只是有时。这是不必要的,只会让事情变得更复杂。
你的基本问题是应该只有一个 front
,它应该是一个 class 成员而不是局部变量。这就是你的第一个节点的LString
class"keeps track"。
public class LString {
private ListNode front = null;
private int size = 0;
...
这将使您入门并允许您维护实际列表。您的其他 LString
方法也需要一些工作,但是一旦您解决了这个问题,您应该能够使用调试器单步执行代码并自行解决其余问题。
我目前正在开发自己的 Java class 称为 LString,它用于在字符链表和字符串链表之间来回转换。
我的 toString() 方法有问题,特别是跟踪链表的 "head" 以便遍历它并将字符连接成一个新字符串。在研究时,我读到我应该以某种方式跟踪列表的头部,但我不知道如何实现它。
如有任何帮助,我们将不胜感激!
编辑:我收到的错误消息是:
LString.java:79: 错误: 找不到符号
ListNode current = this.front;
public class LString{
private static int length;
// ListNode constructors
// Creates a new ListNode with characters stored in variable "data" and
// Node named next
private class ListNode{
char item;
ListNode next;
private ListNode(){
}
// creates a new ListNode that has the value and links to the specified ListNode
private ListNode(char item, ListNode next){
this.item = item;
this.next = next;
}
// given a character, creates a new ListNode that doesn't link to anything
private ListNode(char item){
this.item = item;
this.next = null;
}
}
public LString(){
this.length = 0;
ListNode front = new ListNode();
}
//LString
// Takes in a String object and loops until it has added all characters to a new linked list
public LString(String original){
ListNode front;
this.length = 1; // length keeps track of number of nodes
if (original.charAt(0) == 0){ // creates a new ListNode if it is an empty string
front = new ListNode();
}
else {
front = new ListNode(original.charAt(0));
}
//System.out.println("this is happening " + front.item);
//ListNode current = front;
for (int index = 1; index < original.length(); index++) {
front.next = new ListNode(original.charAt(index), front.next);
front = front.next;
//System.out.println("strings: " + front.item);
length++;
}
//System.out.println("length: " + length);
}
// returns length of the LString object
public int length(){
return this.length;
}
// toString takes an LString object and converts it to a string
public String toString(){
StringBuilder newString;
ListNode current = this.front;
while (current.next != null){
newString.append(current.item);
current = current.next;
}
return newString.toString();
}
public static void main(String[] args){
LString stuffTest = new LString("hello");
int valueOf = stuffTest.length();
System.out.println(stuffTest.length());
String testMeWhy = stuffTest.toString();
}
}
通过追加到末尾来构建链表的一般模式是:
开头:
head = null;
tail = null;
要将 newNode
添加到列表中:
if (head == null) {
head = newNode;
} else {
tail.next = newNode;
}
tail = newNode;
我认为您试图通过在列表中只保留一个指针来做到这一点 class,但效果不是很好。此外,使用此模式做事意味着您不必在列表的前面有一个 "special" 节点,除非有其他一些充分的理由。看起来您正在尝试不带参数地使用 new ListNode()
来创建某种特殊节点,但只是有时。这是不必要的,只会让事情变得更复杂。
你的基本问题是应该只有一个 front
,它应该是一个 class 成员而不是局部变量。这就是你的第一个节点的LString
class"keeps track"。
public class LString {
private ListNode front = null;
private int size = 0;
...
这将使您入门并允许您维护实际列表。您的其他 LString
方法也需要一些工作,但是一旦您解决了这个问题,您应该能够使用调试器单步执行代码并自行解决其余问题。