Java でカスタム LinkedList を作成しました。これは、マップとリストのクロスのようなものです。私は学ぶためにこの演習を行っただけで、HashMap がより優れた高速な実装であることを知っています。私は LinkedList の削除メソッドを実装しましたが、特定の要素のすべての出現を基本的に削除する deleteAll メソッドを記述する最も最適な方法について少し混乱しています。
コード:
public class LinkedListMain
{
public static void main(String[] args)
{
LinkedList linkedList = new LinkedList();
System.out.println("isEmpty: " + linkedList.isEmpty());
linkedList.insert("abc", 34);
linkedList.insert("pqr", 44);
linkedList.insert("xyz", 54);
linkedList.insert("asd", 64);
linkedList.insert("abc", 74);
linkedList.print();
/* System.out.println("delete: " + linkedList.delete("abc"));
System.out.println("delete: " + linkedList.delete("pqr"));
System.out.println("delete: " + linkedList.delete("xyz"));
System.out.println("delete: " + linkedList.delete("asd"));
*/
System.out.println("deleteAll: " + linkedList.deleteAll("abc"));
System.out.println("isEmpty: " + linkedList.isEmpty());
}
}
class LinkedList
{
private ListNode first;
private ListNode last;
public LinkedList()
{
first = null;
last = first;
}
public void insert(String d1, int d2)
{
ListNode node = new ListNode(d1, d2);
if(first == null)
{
node.next = null;
first = node;
last = node;
}
else
{
last.next = node;
node.next = null;
last = node;
}
}
public String deleteAll(String str)
{
return "To Be Implemented";
}
public String delete(String str)
{
ListNode slow = first;
ListNode fast = first;
int count = 0;
while(fast != null)
{
if(count > 1)
{
slow = slow.next;
}
if(count <= 1)
{
count++;
}
if(fast.getVal()==str)
{
if(fast == first)
{
first = first.next;
}
else
{
if(fast.next != null)
{
slow.next = fast.next;
}
else
{
slow.next = null;
}
}
fast = null;
return str; // fast.getVal()
}
fast = fast.next;
}
return "not found";
}
public void print()
{
ListNode currentNode = first;
while(currentNode != null)
{
currentNode.print();
currentNode = currentNode.next;
}
}
public boolean isEmpty()
{
// return ( ((first==null) ? (true) : (false)) && ((last==null) ? (true) : (false)));
return (first==null) ? (true) : (false);
}
}
class ListNode
{
private String data1;
private int data2;
public ListNode next;
public ListNode(String d1, int d2)
{
data1 = d1;
data2 = d2;
}
public String getVal()
{
return data1;
}
// public void printMe(ListNode node)
public void print()
{
System.out.println("data1: [" + data1 + "], data2: [" + data2 + "]");
}
}
この例に関連する 3 つの質問があります。
- 理想的な deleteAll 関数は、私の削除関数を繰り返し使用する必要がありますか? これに対応するには、削除機能を変更する必要がありますか?
- isEmpty 関数は、理想的には最初と最後の両方を null と比較する必要がありますか? last を null と比較する必要がある場合、これを実装するには、delete および deleteAll 関数をどのように変更すればよいですか。現在の削除機能でこれを実行しようとしましたが、いくつかの問題が発生しました。
- 一般に、このコードを大幅に最適化できますか? 「完全な連結リストが必要な場合は、コレクションを使用する」という意味ではなく、可能であれば、この単一連結リストをより正確に最適化する方法を尋ねるだけですか?