割り当てと1つの要件のリンクリストの作成に取り組んでいるのは、リストパラメータを受け取り、それを現在のリストの最後に追加するconcatという名前のメソッドです。このメソッドで再帰を使用する必要はありませんが、プログラムでは再帰を多用することになっています。このための再帰的アルゴリズムを考え出すことさえ可能かどうか疑問に思っています。私たちのリストクラスにはヘッドノードしかなく、他には何もありません。また、それらは二重にリンクされていません。
私の現在の試みでは、最初の値を再帰的に追加することしかできません。何が悪いのかはわかっていますが、解決策を思い付くことができません。最初のメソッドは、リストが「連結」に渡されるリストで実際に呼び出される方法です。次に、リストの末尾を見つけて、これらを再帰メソッドに渡そうとします。この「ラッパー」メソッドは、再帰メソッドの必須要件です。これが私の試みですが、すべての呼び出しがスタックから外れ、concatへの再帰呼び出しを再入力すると、ノード参照 "pt"をリスト内の次のノードに進めるのに問題があるため、明らかに失敗しています。これが再帰で可能ですが、この値を最初のリストに進めて再帰呼び出しを再入力する方法、またはこの問題に対するより一般的なアプローチについて教えてください。御時間ありがとうございます。
public void concat(MyString list1) {
CharacterNode tail = null, pt = list1.head;
// Find the tail of the list
if (pt == null) {
} else if (pt.getNext() == null) {
tail = pt;
} else {
while (pt.getNext() != null) {
pt = pt.getNext();
}
tail = pt;
}
list1.head = concat(list1.head, tail, list1.head);
}
private static CharacterNode concat(CharacterNode lhead, CharacterNode tail, CharacterNode pt) {
// Pass in smaller list every time
// Head traverses down list till the end
// Add new node with (pt's letter, null link)
if (lhead == null) {
// If head is null, we need to add the node
lhead = new CharacterNode(pt.getCharacter(),null);
} else if (tail.getNext() == lhead) {
// If the head is past tail, stop
} else {
// Call concat on a smaller list
lhead.setNext(concat(lhead.getNext(),tail,pt));
}
return lhead;
}
CharacterNodeは次のとおりです。
class CharacterNode {
private char letter;
private CharacterNode next;
public CharacterNode(char ch, CharacterNode link) {
letter = ch;
next = link;
}
public void setCharacter(char ch) {
this.letter = ch;
}
public char getCharacter() {
return letter;
}
public void setNext(CharacterNode next) {
this.next = next;
}
public CharacterNode getNext() {
return next;
}
}
MyString:
class MyString {
// member variable pointing to the head of the linked list
private CharacterNode head;
// default constructor
public MyString() {
}
// copy constructor
public MyString(MyString l) {
}
// constructor from a String
public MyString(String s) {
}
// for output purposes -- override Object version
// no spaces between the characters, no line feeds/returns
public String toString() {
}
// create a new node and add it to the head of the list
public void addHead(char ch) {
}
// create a new node and add it to the tail of the list -- "wrapper"
public void addTail(char ch) {
}
// Recursive method for addTail
private static CharacterNode addTail(CharacterNode L, char letter) {
}
// modify the list so it is reversed
public void reverse() {
}
// remove all occurrences of the character from the list -- "wrapper"
public void removeChar(char ch) {
}
// Recursive removeChar method
private static CharacterNode removeChar(CharacterNode n, char letter) {
}
// "wrapper" for recursive length()
public int length() {
}
// Returns the length of the linked list
private static int length(CharacterNode L) {
}
// concatenate a copy of list1 to the end of the list
public void concat(MyString list1) {
}
// recursive method for concat
private static CharacterNode concat(CharacterNode lhead, CharacterNode tail, CharacterNode pt) {
}
}