我在 java 中制作了一个自定义的 LinkedList,它有点像地图和列表之间的交叉。我做这个练习只是为了学习,我知道 HashMap 是一个更好更快的实现。我为 LinkedList 实现了 delete 方法,但是对于哪种是编写方法的最佳方式有点困惑: 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 函数是否应该重复使用我的 delete 函数?我应该更改我的删除功能以适应这种情况吗?
- 理想情况下,isEmpty 函数是否应该将 first 和 last 都与 null 进行比较?如果 last 应该与 null 进行比较,那么我应该如何更改我的 delete 和 deleteAll 函数才能实现它。我尝试使用当前的删除功能执行此操作,但遇到了一些问题。
- 总的来说,这段代码可以显着优化吗?不是说“如果你需要完美的链表,就使用集合”,只是问如果可能的话,如何更精确地优化这个单链表?