0
我在編寫處理鏈接列表的代碼。這個鏈表是不同的,因爲它是一個鍵值對鏈表(單個)。鏈表應該爲用戶提供基本的功能,如檢索鏈表的大小,檢查是否在列表中的鍵,插入和刪除。似乎除了刪除之外,所有功能都正常工作。刪除方法的代碼運行正常,沒有運行時錯誤,但它給我的結果不是我想要的。這裏是我的代碼:從Java鏈接列表中刪除節點
public class SequentialSearch<Key,Value> {
private int N; // number of key-value pairs
private Node head; // the linked list of key-value pairs
private Node tail;
// a helper linked list data type
private class Node {
private Key key;
private Value val;
private Node next;
public Node(Key key, Value val, Node next) {
this.key = key;
this.val = val;
this.next = next;
}
public void setNext(Node next) {
this.next = next;
}
}
public SequentialSearch() {
}
public int size() {
if (head == null)
return 0;
else {
Node x = head;
while (x.next != null) {
N++;
x = x.next;
}
}
return N;
}
public boolean isEmpty() {
return size() == 0;
}
public boolean contains(Key key) {
return get(key) != null;
}
public Value get(Key key) {
for (Node x = head; x != null; x = x.next) {
if (key.equals(x.key))
return x.val;
}
return null;
}
public void put(Key key, Value val) {
if (val == null) {
delete(key);
return;
}
for (Node x = first; x != null; x = x.next) {
if (key.equals(x.key)) {
x.val = val;
return;
}
}
first = new Node(key, val, first);
N++;
}
public boolean delete(Key key) {
Node curr = head;
Node prev = null;
boolean result = false;
if(isEmpty())
System.err.println("Error: The list is empty.");
while(curr != null) {
if(key.equals(curr.key)) {
if(curr.equals(head)) {
head = curr = null;
N--;
result = true;
return result;
} else {
prev.next = curr.next;
curr.setNext(null);
N--;
result = true;
return result;
}
} else {
prev = curr;
curr = curr.next;
}
}
return result;
}
}
我寫了一個主程序,以測試爲補充(put)和刪除,但它似乎是工作的插入而不是刪除。我認爲如果列表中只有一個節點,並且從列表中間刪除一個節點,我可能會遇到刪除問題。
我也試圖通過使用遞歸編寫一個新方法來修改刪除方法,但我遇到了一些錯誤 - 也是邏輯上的。以下是該功能的代碼:
public void delete(Key key) {
first = delete(first, key);
}
private Node delete(Node x, Key key) {
if (x == null) return null;
if (key.equals(x.key)) {
N--;
return x.next;
}
x.next = delete(x.next, key);
return x;
}
請問您是否可以告訴我我做錯了什麼?